Autogenerated HTML docs for v2.31.1-442-g7e391
diff --git a/MyFirstContribution.html b/MyFirstContribution.html index 4d3d0c4..256cc3f 100644 --- a/MyFirstContribution.html +++ b/MyFirstContribution.html
@@ -1912,7 +1912,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-10 15:27:55 PST + 2021-02-11 08:27:55 JST </div> </div> </body>
diff --git a/MyFirstObjectWalk.html b/MyFirstObjectWalk.html index 602f926..bec13b7 100644 --- a/MyFirstObjectWalk.html +++ b/MyFirstObjectWalk.html
@@ -1717,7 +1717,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-12-08 16:10:07 PST + 2020-12-09 09:10:07 JST </div> </div> </body>
diff --git a/RelNotes/2.32.0.txt b/RelNotes/2.32.0.txt index c746ad1..f4e5191 100644 --- a/RelNotes/2.32.0.txt +++ b/RelNotes/2.32.0.txt
@@ -75,6 +75,11 @@ * The command line completion (in contrib/) has learned that CHERRY_PICK_HEAD is a possible pseudo-ref. + * Userdiff patterns for "Scheme" has been added. + + * "git log" learned "--diff-merges=<style>" option, with an + associated configuration variable log.diffMerges. + Performance, Internal Implementation, Development Support etc. @@ -126,6 +131,24 @@ primarily to enhance its test coverage (the strategy has been available as an explicit "-s ort" choice). + * A bit of code clean-up and a lot of test clean-up around userdiff + area. + + * Handling of "promisor packs" that allows certain objects to be + missing and lazily retrievable has been optimized (a bit). + + * When packet_write() fails, we gave an extra error message + unnecessarily, which has been corrected. + + * The checkout machinery has been taught to perform the actual + write-out of the files in parallel when able. + + * Show errno in the trace output in the error codepath that calls + read_raw_ref method. + + * Effort to make the command line completion (in contrib/) safe with + "set -u" continues. + Fixes since v2.31 ----------------- @@ -215,6 +238,30 @@ option. (merge c5c0548d79 vs/completion-with-set-u later to maint). + * When "git pack-objects" makes a literal copy of a part of existing + packfile using the reachability bitmaps, its update to the progress + meter was broken. + (merge 8e118e8490 jk/pack-objects-bitmap-progress-fix later to maint). + + * The dependencies for config-list.h and command-list.h were broken + when the former was split out of the latter, which has been + corrected. + (merge 56550ea718 sg/bugreport-fixes later to maint). + + * "git push --quiet --set-upstream" was not quiet when setting the + upstream branch configuration, which has been corrected. + (merge f3cce896a8 ow/push-quiet-set-upstream later to maint). + + * The prefetch task in "git maintenance" assumed that "git fetch" + from any remote would fetch all its local branches, which would + fetch too much if the user is interested in only a subset of + branches there. + (merge 32f67888d8 ds/maintenance-prefetch-fix later to maint). + + * Clarify that pathnames recorded in Git trees are most often (but + not necessarily) encoded in UTF-8. + (merge 9364bf465d ab/pathname-encoding-doc later to maint). + * Other code cleanup, docfix, build fix, etc. (merge f451960708 dl/cat-file-doc-cleanup later to maint). (merge 12604a8d0c sv/t9801-test-path-is-file-cleanup later to maint). @@ -229,3 +276,7 @@ (merge 28e29ee38b jc/doc-format-patch-clarify later to maint). (merge fc12b6fdde fm/user-manual-use-preface later to maint). (merge dba94e3a85 cc/test-helper-bloom-usage-fix later to maint). + (merge 61a7660516 hn/reftable-tables-doc-update later to maint). + (merge 81ed96a9b2 jt/fetch-pack-request-fix later to maint). + (merge 151b6c2dd7 jc/doc-do-not-capitalize-clarification later to maint). + (merge 9160068ac6 js/access-nul-emulation-on-windows later to maint).
diff --git a/SubmittingPatches.html b/SubmittingPatches.html index 9ef7070..f4f5923 100644 --- a/SubmittingPatches.html +++ b/SubmittingPatches.html
@@ -862,10 +862,13 @@ </ul></div> <div class="paragraph"><p>If in doubt which identifier to use, run <code>git log --no-merges</code> on the files you are modifying to see the current conventions.</p></div> -<div class="paragraph" id="summary-section"><p>It’s customary to start the remainder of the first line after "area: " -with a lower-case letter. E.g. "doc: clarify…", not "doc: -Clarify…", or "githooks.txt: improve…", not "githooks.txt: -Improve…".</p></div> +<div class="paragraph" id="summary-section"><p>The title sentence after the "area:" prefix omits the full stop at the +end, and its first word is not capitalized unless there is a reason to +capitalize it other than because it is the first word in the sentence. +E.g. "doc: clarify…", not "doc: Clarify…", or "githooks.txt: +improve…", not "githooks.txt: Improve…". But "refs: HEAD is also +treated as a ref" is correct, as we spell <code>HEAD</code> in all caps even when +it appears in the middle of a sentence.</p></div> <div class="paragraph" id="meaningful-message"><p>The body should provide a meaningful commit message, which:</p></div> <div class="olist arabic"><ol class="arabic"> <li> @@ -1393,7 +1396,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-17 15:51:21 PDT + 2021-04-30 15:03:36 JST </div> </div> </body>
diff --git a/SubmittingPatches.txt b/SubmittingPatches.txt index 0452db2..55287d7 100644 --- a/SubmittingPatches.txt +++ b/SubmittingPatches.txt
@@ -117,10 +117,13 @@ files you are modifying to see the current conventions. [[summary-section]] -It's customary to start the remainder of the first line after "area: " -with a lower-case letter. E.g. "doc: clarify...", not "doc: -Clarify...", or "githooks.txt: improve...", not "githooks.txt: -Improve...". +The title sentence after the "area:" prefix omits the full stop at the +end, and its first word is not capitalized unless there is a reason to +capitalize it other than because it is the first word in the sentence. +E.g. "doc: clarify...", not "doc: Clarify...", or "githooks.txt: +improve...", not "githooks.txt: Improve...". But "refs: HEAD is also +treated as a ref" is correct, as we spell `HEAD` in all caps even when +it appears in the middle of a sentence. [[meaningful-message]] The body should provide a meaningful commit message, which:
diff --git a/diff-options.txt b/diff-options.txt index aa2b5c1..530d115 100644 --- a/diff-options.txt +++ b/diff-options.txt
@@ -34,7 +34,7 @@ endif::git-format-patch[] ifdef::git-log[] ---diff-merges=(off|none|first-parent|1|separate|m|combined|c|dense-combined|cc):: +--diff-merges=(off|none|on|first-parent|1|separate|m|combined|c|dense-combined|cc):: --no-diff-merges:: Specify diff format to be used for merge commits. Default is {diff-merges-default} unless `--first-parent` is in use, in which case @@ -45,17 +45,24 @@ Disable output of diffs for merge commits. Useful to override implied value. + +--diff-merges=on::: +--diff-merges=m::: +-m::: + This option makes diff output for merge commits to be shown in + the default format. `-m` will produce the output only if `-p` + is given as well. The default format could be changed using + `log.diffMerges` configuration parameter, which default value + is `separate`. ++ --diff-merges=first-parent::: --diff-merges=1::: This option makes merge commits show the full diff with respect to the first parent only. + --diff-merges=separate::: ---diff-merges=m::: --m::: This makes merge commits show the full diff with respect to each of the parents. Separate log entry and diff is generated - for each parent. `-m` doesn't produce any output without `-p`. + for each parent. + --diff-merges=combined::: --diff-merges=c::: @@ -293,11 +300,14 @@ linkgit:git-config[1]). --name-only:: - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the linkgit:git-log[1] + manual page. --name-status:: Show only names and status of changed files. See the description of the `--diff-filter` option on what the status letters mean. + Just like `--name-only` the file names are often encoded in UTF-8. --submodule[=<format>]:: Specify how differences in submodules are shown. When specifying
diff --git a/everyday.html b/everyday.html index 171f2be..0c67470 100644 --- a/everyday.html +++ b/everyday.html
@@ -750,7 +750,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-05-17 15:26:41 PDT + 2016-05-18 07:26:41 JST </div> </div> </body>
diff --git a/fetch-options.txt b/fetch-options.txt index 07783de..9e7b4e1 100644 --- a/fetch-options.txt +++ b/fetch-options.txt
@@ -110,6 +110,11 @@ setting `fetch.writeCommitGraph`. endif::git-pull[] +--prefetch:: + Modify the configured refspec to place all refs into the + `refs/prefetch/` namespace. See the `prefetch` task in + linkgit:git-maintenance[1]. + -p:: --prune:: Before fetching, remove any remote-tracking references that no
diff --git a/git-add.html b/git-add.html index 008a001..26a2528 100644 --- a/git-add.html +++ b/git-add.html
@@ -1375,7 +1375,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-am.html b/git-am.html index d15e32b..89b62e4 100644 --- a/git-am.html +++ b/git-am.html
@@ -1198,7 +1198,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-annotate.html b/git-annotate.html index 466b2d7..5df2fac 100644 --- a/git-annotate.html +++ b/git-annotate.html
@@ -1070,7 +1070,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-apply.html b/git-apply.html index f7a3cd8..3f9ab40 100644 --- a/git-apply.html +++ b/git-apply.html
@@ -1221,7 +1221,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-15 14:08:03 PDT + 2021-04-16 06:08:03 JST </div> </div> </body>
diff --git a/git-archimport.html b/git-archimport.html index db7a841..6aac06b 100644 --- a/git-archimport.html +++ b/git-archimport.html
@@ -905,7 +905,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-archive.html b/git-archive.html index f2dd90a..41ecef3 100644 --- a/git-archive.html +++ b/git-archive.html
@@ -1106,7 +1106,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-05 15:17:53 PDT + 2020-10-06 07:17:53 JST </div> </div> </body>
diff --git a/git-bisect.html b/git-bisect.html index 2c963dc..2292444 100644 --- a/git-bisect.html +++ b/git-bisect.html
@@ -1240,7 +1240,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-09-03 13:19:53 PDT + 2020-09-04 05:19:53 JST </div> </div> </body>
diff --git a/git-blame.html b/git-blame.html index 7961384..dff2c14 100644 --- a/git-blame.html +++ b/git-blame.html
@@ -1365,7 +1365,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-25 15:29:19 PST + 2021-01-26 08:29:19 JST </div> </div> </body>
diff --git a/git-branch.html b/git-branch.html index 455198c..c8ee1f6 100644 --- a/git-branch.html +++ b/git-branch.html
@@ -1397,7 +1397,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-bugreport.html b/git-bugreport.html index caf04f5..92482e8 100644 --- a/git-bugreport.html +++ b/git-bugreport.html
@@ -856,7 +856,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-06-08 18:30:54 PDT + 2020-06-09 10:30:54 JST </div> </div> </body>
diff --git a/git-bundle.html b/git-bundle.html index a933375..9ce1425 100644 --- a/git-bundle.html +++ b/git-bundle.html
@@ -1046,7 +1046,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-11 18:39:25 PDT + 2020-08-12 10:39:25 JST </div> </div> </body>
diff --git a/git-cat-file.html b/git-cat-file.html index 9376299..45d717d 100644 --- a/git-cat-file.html +++ b/git-cat-file.html
@@ -1186,7 +1186,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-22 14:17:33 PDT + 2021-03-23 06:17:33 JST </div> </div> </body>
diff --git a/git-check-attr.html b/git-check-attr.html index 731e57d..c4c38fe 100644 --- a/git-check-attr.html +++ b/git-check-attr.html
@@ -960,7 +960,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-check-ignore.html b/git-check-ignore.html index 0b792ee..8c3f2f5 100644 --- a/git-check-ignore.html +++ b/git-check-ignore.html
@@ -924,7 +924,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-check-mailmap.html b/git-check-mailmap.html index db4d1bd..7bf7df5 100644 --- a/git-check-mailmap.html +++ b/git-check-mailmap.html
@@ -811,7 +811,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-25 15:29:19 PST + 2021-01-26 08:29:19 JST </div> </div> </body>
diff --git a/git-check-ref-format.html b/git-check-ref-format.html index c721c11..bb6ed36 100644 --- a/git-check-ref-format.html +++ b/git-check-ref-format.html
@@ -963,7 +963,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-checkout-index.html b/git-checkout-index.html index 291b33e..160aa1f 100644 --- a/git-checkout-index.html +++ b/git-checkout-index.html
@@ -1009,7 +1009,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-checkout.html b/git-checkout.html index 4afa59e..b3f96d3 100644 --- a/git-checkout.html +++ b/git-checkout.html
@@ -1560,7 +1560,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-27 15:58:27 PDT + 2020-10-28 07:58:27 JST </div> </div> </body>
diff --git a/git-cherry-pick.html b/git-cherry-pick.html index 4390f65..3527697 100644 --- a/git-cherry-pick.html +++ b/git-cherry-pick.html
@@ -1212,7 +1212,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-cherry.html b/git-cherry.html index 4dcf809..4ec5d2b 100644 --- a/git-cherry.html +++ b/git-cherry.html
@@ -915,7 +915,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-12-12 16:55:14 PST + 2013-12-13 09:55:14 JST </div> </div> </body>
diff --git a/git-citool.html b/git-citool.html index 846b53a..5bd454e 100644 --- a/git-citool.html +++ b/git-citool.html
@@ -776,7 +776,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-clean.html b/git-clean.html index bcd2c6a..f659170 100644 --- a/git-clean.html +++ b/git-clean.html
@@ -973,7 +973,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-clone.html b/git-clone.html index 0acf3e8..56f36da 100644 --- a/git-clone.html +++ b/git-clone.html
@@ -1430,7 +1430,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-08 14:45:29 PDT + 2021-04-09 06:45:29 JST </div> </div> </body>
diff --git a/git-column.html b/git-column.html index b36d79d..e8b1ec3 100644 --- a/git-column.html +++ b/git-column.html
@@ -873,7 +873,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-commit-graph.html b/git-commit-graph.html index de21e2a..a087d1d 100644 --- a/git-commit-graph.html +++ b/git-commit-graph.html
@@ -940,7 +940,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-commit-tree.html b/git-commit-tree.html index dadb3d6..659248a 100644 --- a/git-commit-tree.html +++ b/git-commit-tree.html
@@ -1029,7 +1029,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-04-22 14:37:28 PDT + 2020-04-23 06:37:28 JST </div> </div> </body>
diff --git a/git-commit.html b/git-commit.html index 6b6c0e4..db33aaa 100644 --- a/git-commit.html +++ b/git-commit.html
@@ -1780,7 +1780,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-07 17:16:19 PDT + 2021-04-08 09:16:19 JST </div> </div> </body>
diff --git a/git-config.html b/git-config.html index 9b29bc8..6eecdd5 100644 --- a/git-config.html +++ b/git-config.html
@@ -3430,6 +3430,36 @@ </p> </dd> <dt class="hdlist1"> +checkout.workers +</dt> +<dd> +<p> + The number of parallel workers to use when updating the working tree. + The default is one, i.e. sequential execution. If set to a value less + than one, Git will use as many workers as the number of logical cores + available. This setting and <code>checkout.thresholdForParallelism</code> affect + all commands that perform checkout. E.g. checkout, clone, reset, + sparse-checkout, etc. +</p> +<div class="paragraph"><p>Note: parallel checkout usually delivers better performance for repositories +located on SSDs or over NFS. For repositories on spinning disks and/or machines +with a small number of cores, the default sequential checkout often performs +better. The size and compression level of a repository might also influence how +well the parallel version performs.</p></div> +</dd> +<dt class="hdlist1"> +checkout.thresholdForParallelism +</dt> +<dd> +<p> + When running parallel checkout with a small number of files, the cost + of subprocess spawning and inter-process communication might outweigh + the parallelization gains. This setting allows to define the minimum + number of files for which parallel checkout should be attempted. The + default is 100. +</p> +</dd> +<dt class="hdlist1"> clean.requireForce </dt> <dd> @@ -6819,6 +6849,16 @@ </p> </dd> <dt class="hdlist1"> +index.sparse +</dt> +<dd> +<p> + When enabled, write the index using sparse-directory entries. This + has no effect unless <code>core.sparseCheckout</code> and + <code>core.sparseCheckoutCone</code> are both enabled. Defaults to <em>false</em>. +</p> +</dd> +<dt class="hdlist1"> index.threads </dt> <dd> @@ -6979,6 +7019,16 @@ </p> </dd> <dt class="hdlist1"> +log.diffMerges +</dt> +<dd> +<p> + Set default diff format to be used for merge commits. See + <code>--diff-merges</code> in <a href="git-log.html">git-log(1)</a> for details. + Defaults to <code>separate</code>. +</p> +</dd> +<dt class="hdlist1"> log.follow </dt> <dd> @@ -10307,7 +10357,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-25 15:29:19 PST + 2021-01-26 08:29:19 JST </div> </div> </body>
diff --git a/git-count-objects.html b/git-count-objects.html index 8a2f46e..ce501f8 100644 --- a/git-count-objects.html +++ b/git-count-objects.html
@@ -815,7 +815,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-10-17 15:22:26 PDT + 2016-10-18 07:22:26 JST </div> </div> </body>
diff --git a/git-credential-cache--daemon.html b/git-credential-cache--daemon.html index adcefec..4abd8d9 100644 --- a/git-credential-cache--daemon.html +++ b/git-credential-cache--daemon.html
@@ -786,7 +786,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2014-09-26 15:36:58 PDT + 2014-09-27 07:36:58 JST </div> </div> </body>
diff --git a/git-credential-cache.html b/git-credential-cache.html index b712954..b70c45f 100644 --- a/git-credential-cache.html +++ b/git-credential-cache.html
@@ -842,7 +842,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-credential-store.html b/git-credential-store.html index a506e17..04bf7c8 100644 --- a/git-credential-store.html +++ b/git-credential-store.html
@@ -882,7 +882,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-05-08 15:24:24 PDT + 2020-05-09 07:24:24 JST </div> </div> </body>
diff --git a/git-credential.html b/git-credential.html index 525cd66..e6ed855 100644 --- a/git-credential.html +++ b/git-credential.html
@@ -940,7 +940,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-05-26 11:29:03 PDT + 2020-05-27 03:29:03 JST </div> </div> </body>
diff --git a/git-cvsexportcommit.html b/git-cvsexportcommit.html index 3b74804..1c8cc47 100644 --- a/git-cvsexportcommit.html +++ b/git-cvsexportcommit.html
@@ -951,7 +951,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-cvsimport.html b/git-cvsimport.html index 780ed1b..e6c31e8 100644 --- a/git-cvsimport.html +++ b/git-cvsimport.html
@@ -1107,7 +1107,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-09-26 16:43:51 PDT + 2016-09-27 08:43:51 JST </div> </div> </body>
diff --git a/git-cvsserver.html b/git-cvsserver.html index 4626042..326ef5d 100644 --- a/git-cvsserver.html +++ b/git-cvsserver.html
@@ -1313,7 +1313,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-daemon.html b/git-daemon.html index 3db9610..e51fd0e 100644 --- a/git-daemon.html +++ b/git-daemon.html
@@ -1280,7 +1280,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-describe.html b/git-describe.html index cfaf589..206ff9c 100644 --- a/git-describe.html +++ b/git-describe.html
@@ -1038,7 +1038,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-diff-files.html b/git-diff-files.html index 3c9ea32..072671c 100644 --- a/git-diff-files.html +++ b/git-diff-files.html
@@ -1142,7 +1142,9 @@ </dt> <dd> <p> - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the <a href="git-log.html">git-log(1)</a> + manual page. </p> </dd> <dt class="hdlist1"> @@ -1152,6 +1154,7 @@ <p> Show only names and status of changed files. See the description of the <code>--diff-filter</code> option on what the status letters mean. + Just like <code>--name-only</code> the file names are often encoded in UTF-8. </p> </dd> <dt class="hdlist1"> @@ -2689,7 +2692,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-diff-index.html b/git-diff-index.html index 6bae181..f78cd1a 100644 --- a/git-diff-index.html +++ b/git-diff-index.html
@@ -1143,7 +1143,9 @@ </dt> <dd> <p> - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the <a href="git-log.html">git-log(1)</a> + manual page. </p> </dd> <dt class="hdlist1"> @@ -1153,6 +1155,7 @@ <p> Show only names and status of changed files. See the description of the <code>--diff-filter</code> option on what the status letters mean. + Just like <code>--name-only</code> the file names are often encoded in UTF-8. </p> </dd> <dt class="hdlist1"> @@ -2783,7 +2786,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-diff-tree.html b/git-diff-tree.html index fc76e7b..4d144de 100644 --- a/git-diff-tree.html +++ b/git-diff-tree.html
@@ -1144,7 +1144,9 @@ </dt> <dd> <p> - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the <a href="git-log.html">git-log(1)</a> + manual page. </p> </dd> <dt class="hdlist1"> @@ -1154,6 +1156,7 @@ <p> Show only names and status of changed files. See the description of the <code>--diff-filter</code> option on what the status letters mean. + Just like <code>--name-only</code> the file names are often encoded in UTF-8. </p> </dd> <dt class="hdlist1"> @@ -3926,7 +3929,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-diff.html b/git-diff.html index 2320b66..7cbaef3 100644 --- a/git-diff.html +++ b/git-diff.html
@@ -1272,7 +1272,9 @@ </dt> <dd> <p> - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the <a href="git-log.html">git-log(1)</a> + manual page. </p> </dd> <dt class="hdlist1"> @@ -1282,6 +1284,7 @@ <p> Show only names and status of changed files. See the description of the <code>--diff-filter</code> option on what the status letters mean. + Just like <code>--name-only</code> the file names are often encoded in UTF-8. </p> </dd> <dt class="hdlist1"> @@ -2980,7 +2983,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-difftool.html b/git-difftool.html index 2893f52..2fdee3c 100644 --- a/git-difftool.html +++ b/git-difftool.html
@@ -1024,7 +1024,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-fast-export.html b/git-fast-export.html index 08958f9..de0bb2e 100644 --- a/git-fast-export.html +++ b/git-fast-export.html
@@ -1120,7 +1120,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-07-06 22:33:22 PDT + 2020-07-07 14:33:22 JST </div> </div> </body>
diff --git a/git-fast-import.html b/git-fast-import.html index 53381ed..bc7a7b6 100644 --- a/git-fast-import.html +++ b/git-fast-import.html
@@ -2616,7 +2616,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-05 15:17:53 PDT + 2020-10-06 07:17:53 JST </div> </div> </body>
diff --git a/git-fetch-pack.html b/git-fetch-pack.html index e245001..dca1071 100644 --- a/git-fetch-pack.html +++ b/git-fetch-pack.html
@@ -974,7 +974,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-fetch.html b/git-fetch.html index 06880c6..4650035 100644 --- a/git-fetch.html +++ b/git-fetch.html
@@ -978,6 +978,16 @@ </p> </dd> <dt class="hdlist1"> +--prefetch +</dt> +<dd> +<p> + Modify the configured refspec to place all refs into the + <code>refs/prefetch/</code> namespace. See the <code>prefetch</code> task in + <a href="git-maintenance.html">git-maintenance(1)</a>. +</p> +</dd> +<dt class="hdlist1"> -p </dt> <dt class="hdlist1"> @@ -1977,7 +1987,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-09-03 13:19:53 PDT + 2020-09-04 05:19:53 JST </div> </div> </body>
diff --git a/git-filter-branch.html b/git-filter-branch.html index 66001c7..06843da 100644 --- a/git-filter-branch.html +++ b/git-filter-branch.html
@@ -1626,7 +1626,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-26 15:41:26 PDT + 2020-10-27 07:41:26 JST </div> </div> </body>
diff --git a/git-fmt-merge-msg.html b/git-fmt-merge-msg.html index 7c45373..1953b10 100644 --- a/git-fmt-merge-msg.html +++ b/git-fmt-merge-msg.html
@@ -908,7 +908,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-for-each-ref.html b/git-for-each-ref.html index 0dbb45f..2f3699c 100644 --- a/git-for-each-ref.html +++ b/git-for-each-ref.html
@@ -1324,7 +1324,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-02 23:05:01 PST + 2021-03-03 16:05:01 JST </div> </div> </body>
diff --git a/git-for-each-repo.html b/git-for-each-repo.html index b724dd7..453016c 100644 --- a/git-for-each-repo.html +++ b/git-for-each-repo.html
@@ -812,7 +812,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-18 14:12:24 PST + 2020-11-19 07:12:24 JST </div> </div> </body>
diff --git a/git-format-patch.html b/git-format-patch.html index 964cd67..a61d3cd 100644 --- a/git-format-patch.html +++ b/git-format-patch.html
@@ -2554,7 +2554,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-02 15:10:10 PDT + 2021-04-03 07:10:10 JST </div> </div> </body>
diff --git a/git-fsck-objects.html b/git-fsck-objects.html index 8129b86..cc977b3 100644 --- a/git-fsck-objects.html +++ b/git-fsck-objects.html
@@ -772,7 +772,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-fsck.html b/git-fsck.html index de2d0fc..fe40cf7 100644 --- a/git-fsck.html +++ b/git-fsck.html
@@ -1103,7 +1103,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-03 16:00:11 PST + 2021-02-04 09:00:11 JST </div> </div> </body>
diff --git a/git-gc.html b/git-gc.html index f974a07..501d032 100644 --- a/git-gc.html +++ b/git-gc.html
@@ -1165,7 +1165,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-get-tar-commit-id.html b/git-get-tar-commit-id.html index ee2ecbc..184ed9f 100644 --- a/git-get-tar-commit-id.html +++ b/git-get-tar-commit-id.html
@@ -778,7 +778,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2015-10-26 16:13:38 PDT + 2015-10-27 08:13:38 JST </div> </div> </body>
diff --git a/git-grep.html b/git-grep.html index 4940851..5686c91 100644 --- a/git-grep.html +++ b/git-grep.html
@@ -1469,7 +1469,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-18 14:12:24 PST + 2020-11-19 07:12:24 JST </div> </div> </body>
diff --git a/git-gui.html b/git-gui.html index 62a6760..688e6d7 100644 --- a/git-gui.html +++ b/git-gui.html
@@ -945,7 +945,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-hash-object.html b/git-hash-object.html index 0e8535c..80eff48 100644 --- a/git-hash-object.html +++ b/git-hash-object.html
@@ -853,7 +853,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-help.html b/git-help.html index d677482..904e7f0 100644 --- a/git-help.html +++ b/git-help.html
@@ -1011,7 +1011,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-10 16:30:08 PDT + 2020-08-11 08:30:08 JST </div> </div> </body>
diff --git a/git-http-backend.html b/git-http-backend.html index b5a7421..c3be17b 100644 --- a/git-http-backend.html +++ b/git-http-backend.html
@@ -1079,7 +1079,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-http-fetch.html b/git-http-fetch.html index 7e4411a..20437cf 100644 --- a/git-http-fetch.html +++ b/git-http-fetch.html
@@ -860,7 +860,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-02 23:05:01 PST + 2021-03-03 16:05:01 JST </div> </div> </body>
diff --git a/git-http-push.html b/git-http-push.html index d0db43c..ba80273 100644 --- a/git-http-push.html +++ b/git-http-push.html
@@ -909,7 +909,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-imap-send.html b/git-imap-send.html index 565ae0f..a7bd8f5 100644 --- a/git-imap-send.html +++ b/git-imap-send.html
@@ -1025,7 +1025,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-09-09 15:23:32 PDT + 2020-09-10 07:23:32 JST </div> </div> </body>
diff --git a/git-index-pack.html b/git-index-pack.html index 6169e4a..168ac5c 100644 --- a/git-index-pack.html +++ b/git-index-pack.html
@@ -958,7 +958,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-02 23:05:01 PST + 2021-03-03 16:05:01 JST </div> </div> </body>
diff --git a/git-init-db.html b/git-init-db.html index 5eae98f..ad27360 100644 --- a/git-init-db.html +++ b/git-init-db.html
@@ -772,7 +772,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-init.html b/git-init.html index 2db5bed..5521301 100644 --- a/git-init.html +++ b/git-init.html
@@ -1003,7 +1003,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-12-18 16:26:08 PST + 2020-12-19 09:26:08 JST </div> </div> </body>
diff --git a/git-instaweb.html b/git-instaweb.html index 31f3bc2..3fdec6b 100644 --- a/git-instaweb.html +++ b/git-instaweb.html
@@ -907,7 +907,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-interpret-trailers.html b/git-interpret-trailers.html index 1fdaa25..19fea03 100644 --- a/git-interpret-trailers.html +++ b/git-interpret-trailers.html
@@ -1255,7 +1255,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-log.html b/git-log.html index 78a5341..64e8631 100644 --- a/git-log.html +++ b/git-log.html
@@ -3408,7 +3408,7 @@ </p> </dd> <dt class="hdlist1"> ---diff-merges=(off|none|first-parent|1|separate|m|combined|c|dense-combined|cc) +--diff-merges=(off|none|on|first-parent|1|separate|m|combined|c|dense-combined|cc) </dt> <dt class="hdlist1"> --no-diff-merges @@ -3433,6 +3433,24 @@ </p> </dd> <dt class="hdlist1"> +--diff-merges=on +</dt> +<dt class="hdlist1"> +--diff-merges=m +</dt> +<dt class="hdlist1"> +-m +</dt> +<dd> +<p> + This option makes diff output for merge commits to be shown in + the default format. <code>-m</code> will produce the output only if <code>-p</code> + is given as well. The default format could be changed using + <code>log.diffMerges</code> configuration parameter, which default value + is <code>separate</code>. +</p> +</dd> +<dt class="hdlist1"> --diff-merges=first-parent </dt> <dt class="hdlist1"> @@ -3447,17 +3465,11 @@ <dt class="hdlist1"> --diff-merges=separate </dt> -<dt class="hdlist1"> ---diff-merges=m -</dt> -<dt class="hdlist1"> --m -</dt> <dd> <p> This makes merge commits show the full diff with respect to each of the parents. Separate log entry and diff is generated - for each parent. <code>-m</code> doesn’t produce any output without <code>-p</code>. + for each parent. </p> </dd> <dt class="hdlist1"> @@ -3872,7 +3884,9 @@ </dt> <dd> <p> - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the <a href="git-log.html">git-log(1)</a> + manual page. </p> </dd> <dt class="hdlist1"> @@ -3882,6 +3896,7 @@ <p> Show only names and status of changed files. See the description of the <code>--diff-filter</code> option on what the status letters mean. + Just like <code>--name-only</code> the file names are often encoded in UTF-8. </p> </dd> <dt class="hdlist1"> @@ -5279,7 +5294,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-05 17:34:58 PST + 2021-02-06 10:34:58 JST </div> </div> </body>
diff --git a/git-ls-files.html b/git-ls-files.html index 27c7e31..815792a 100644 --- a/git-ls-files.html +++ b/git-ls-files.html
@@ -1231,7 +1231,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-05 17:34:58 PST + 2021-02-06 10:34:58 JST </div> </div> </body>
diff --git a/git-ls-remote.html b/git-ls-remote.html index 39d26f9..b9ad170 100644 --- a/git-ls-remote.html +++ b/git-ls-remote.html
@@ -945,7 +945,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-07-06 22:33:22 PDT + 2020-07-07 14:33:22 JST </div> </div> </body>
diff --git a/git-ls-tree.html b/git-ls-tree.html index f0c4203..024ca46 100644 --- a/git-ls-tree.html +++ b/git-ls-tree.html
@@ -930,7 +930,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-11 14:07:52 PST + 2020-11-12 07:07:52 JST </div> </div> </body>
diff --git a/git-mailinfo.html b/git-mailinfo.html index 1d78c7a..44df231 100644 --- a/git-mailinfo.html +++ b/git-mailinfo.html
@@ -914,7 +914,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-mailsplit.html b/git-mailsplit.html index ee8c8c6..7887ef4 100644 --- a/git-mailsplit.html +++ b/git-mailsplit.html
@@ -860,7 +860,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-07-06 14:33:48 PDT + 2016-07-07 06:33:48 JST </div> </div> </body>
diff --git a/git-maintenance.html b/git-maintenance.html index 639b907..434b53a 100644 --- a/git-maintenance.html +++ b/git-maintenance.html
@@ -893,10 +893,8 @@ <p> The <code>prefetch</code> task updates the object directory with the latest objects from all registered remotes. For each remote, a <code>git fetch</code> - command is run. The refmap is custom to avoid updating local or remote - branches (those in <code>refs/heads</code> or <code>refs/remotes</code>). Instead, the - remote refs are stored in <code>refs/prefetch/<remote>/</code>. Also, tags are - not updated. + command is run. The configured refspec is modified to place all + requested refs within <code>refs/prefetch/</code>. Also, tags are not updated. </p> <div class="paragraph"><p>This is done to avoid disrupting the remote-tracking branches. The end users expect these refs to stay unmoved unless they initiate a fetch. With prefetch @@ -1186,7 +1184,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-22 16:54:23 PST + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/git-maintenance.txt b/git-maintenance.txt index 80ddd33..1e738ad 100644 --- a/git-maintenance.txt +++ b/git-maintenance.txt
@@ -92,10 +92,8 @@ prefetch:: The `prefetch` task updates the object directory with the latest objects from all registered remotes. For each remote, a `git fetch` - command is run. The refmap is custom to avoid updating local or remote - branches (those in `refs/heads` or `refs/remotes`). Instead, the - remote refs are stored in `refs/prefetch/<remote>/`. Also, tags are - not updated. + command is run. The configured refspec is modified to place all + requested refs within `refs/prefetch/`. Also, tags are not updated. + This is done to avoid disrupting the remote-tracking branches. The end users expect these refs to stay unmoved unless they initiate a fetch. With prefetch
diff --git a/git-merge-base.html b/git-merge-base.html index a7a4e37..9af4c01 100644 --- a/git-merge-base.html +++ b/git-merge-base.html
@@ -1017,7 +1017,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-merge-file.html b/git-merge-file.html index a1a9f85..129e443 100644 --- a/git-merge-file.html +++ b/git-merge-file.html
@@ -886,7 +886,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2015-10-30 14:57:17 PDT + 2015-10-31 06:57:17 JST </div> </div> </body>
diff --git a/git-merge-index.html b/git-merge-index.html index dbf4585..441bedc 100644 --- a/git-merge-index.html +++ b/git-merge-index.html
@@ -852,7 +852,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-merge-one-file.html b/git-merge-one-file.html index dd931f0..414cb47 100644 --- a/git-merge-one-file.html +++ b/git-merge-one-file.html
@@ -772,7 +772,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-merge-tree.html b/git-merge-tree.html index 5fb42b3..ef01648 100644 --- a/git-merge-tree.html +++ b/git-merge-tree.html
@@ -779,7 +779,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-09-17 14:33:14 PDT + 2013-09-18 06:33:14 JST </div> </div> </body>
diff --git a/git-merge.html b/git-merge.html index ea93660..e5fa08d 100644 --- a/git-merge.html +++ b/git-merge.html
@@ -2151,7 +2151,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-05-08 15:24:24 PDT + 2020-05-09 07:24:24 JST </div> </div> </body>
diff --git a/git-mergetool--lib.html b/git-mergetool--lib.html index 258a1aa..5c143ff 100644 --- a/git-mergetool--lib.html +++ b/git-mergetool--lib.html
@@ -832,7 +832,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-22 16:54:23 PST + 2021-02-23 09:54:23 JST </div> </div> </body>
diff --git a/git-mergetool.html b/git-mergetool.html index bcb5715..4ef89ba 100644 --- a/git-mergetool.html +++ b/git-mergetool.html
@@ -1047,7 +1047,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-17 15:50:25 PDT + 2021-03-18 07:50:25 JST </div> </div> </body>
diff --git a/git-mktag.html b/git-mktag.html index f3f61f9..d6c6a96 100644 --- a/git-mktag.html +++ b/git-mktag.html
@@ -828,7 +828,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-25 15:29:19 PST + 2021-01-26 08:29:19 JST </div> </div> </body>
diff --git a/git-mktree.html b/git-mktree.html index afe9e70..dadc3a1 100644 --- a/git-mktree.html +++ b/git-mktree.html
@@ -811,7 +811,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-multi-pack-index.html b/git-multi-pack-index.html index 004a6ec..e96cee7 100644 --- a/git-multi-pack-index.html +++ b/git-multi-pack-index.html
@@ -911,7 +911,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-08 14:45:29 PDT + 2021-04-09 06:45:29 JST </div> </div> </body>
diff --git a/git-mv.html b/git-mv.html index 2af0eee..7296c02 100644 --- a/git-mv.html +++ b/git-mv.html
@@ -857,7 +857,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-07-13 14:58:50 PDT + 2016-07-14 06:58:50 JST </div> </div> </body>
diff --git a/git-name-rev.html b/git-name-rev.html index 7899797..c39d702 100644 --- a/git-name-rev.html +++ b/git-name-rev.html
@@ -881,7 +881,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-notes.html b/git-notes.html index e478629..47a1cc7 100644 --- a/git-notes.html +++ b/git-notes.html
@@ -1344,7 +1344,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-10 16:30:08 PDT + 2020-08-11 08:30:08 JST </div> </div> </body>
diff --git a/git-p4.html b/git-p4.html index cf1543f..3efbc70 100644 --- a/git-p4.html +++ b/git-p4.html
@@ -1923,7 +1923,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-15 16:12:09 PST + 2021-01-16 09:12:09 JST </div> </div> </body>
diff --git a/git-pack-objects.html b/git-pack-objects.html index 336b392..bfafb45 100644 --- a/git-pack-objects.html +++ b/git-pack-objects.html
@@ -1352,7 +1352,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-24 15:15:46 PDT + 2021-03-25 07:15:46 JST </div> </div> </body>
diff --git a/git-pack-redundant.html b/git-pack-redundant.html index 525ee9c..ab3e0b2 100644 --- a/git-pack-redundant.html +++ b/git-pack-redundant.html
@@ -819,7 +819,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-pack-refs.html b/git-pack-refs.html index e0982e6..830cde0 100644 --- a/git-pack-refs.html +++ b/git-pack-refs.html
@@ -831,7 +831,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-patch-id.html b/git-patch-id.html index 92a2262..a167a9f 100644 --- a/git-patch-id.html +++ b/git-patch-id.html
@@ -837,7 +837,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2017-08-04 09:39:17 PDT + 2017-08-05 01:39:17 JST </div> </div> </body>
diff --git a/git-prune-packed.html b/git-prune-packed.html index 1c65968..59534cc 100644 --- a/git-prune-packed.html +++ b/git-prune-packed.html
@@ -814,7 +814,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2014-10-20 14:13:43 PDT + 2014-10-21 06:13:43 JST </div> </div> </body>
diff --git a/git-prune.html b/git-prune.html index ed4711b..f6ef946 100644 --- a/git-prune.html +++ b/git-prune.html
@@ -884,7 +884,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-pull.html b/git-pull.html index 77222c0..78f9bdf 100644 --- a/git-pull.html +++ b/git-pull.html
@@ -1314,6 +1314,16 @@ </p> </dd> <dt class="hdlist1"> +--prefetch +</dt> +<dd> +<p> + Modify the configured refspec to place all refs into the + <code>refs/prefetch/</code> namespace. See the <code>prefetch</code> task in + <a href="git-maintenance.html">git-maintenance(1)</a>. +</p> +</dd> +<dt class="hdlist1"> -p </dt> <dt class="hdlist1"> @@ -2240,7 +2250,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-04-29 16:59:10 PDT + 2020-04-30 08:59:10 JST </div> </div> </body>
diff --git a/git-push.html b/git-push.html index 3b37579..e999b6d 100644 --- a/git-push.html +++ b/git-push.html
@@ -1971,7 +1971,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-24 15:15:46 PDT + 2021-03-25 07:15:46 JST </div> </div> </body>
diff --git a/git-quiltimport.html b/git-quiltimport.html index 2c0bb55..05612c5 100644 --- a/git-quiltimport.html +++ b/git-quiltimport.html
@@ -841,7 +841,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-range-diff.html b/git-range-diff.html index b6232ce..806beb6 100644 --- a/git-range-diff.html +++ b/git-range-diff.html
@@ -1082,7 +1082,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-22 16:54:23 PST + 2021-02-23 09:54:23 JST </div> </div> </body>
diff --git a/git-read-tree.html b/git-read-tree.html index 2677196..f25f732 100644 --- a/git-read-tree.html +++ b/git-read-tree.html
@@ -1306,7 +1306,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-04-29 14:18:27 PDT + 2020-04-30 06:18:27 JST </div> </div> </body>
diff --git a/git-rebase.html b/git-rebase.html index 467b503..b5821bf 100644 --- a/git-rebase.html +++ b/git-rebase.html
@@ -2758,7 +2758,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-26 15:44:23 PDT + 2021-03-27 07:44:23 JST </div> </div> </body>
diff --git a/git-receive-pack.html b/git-receive-pack.html index 5dadab0..033693c 100644 --- a/git-receive-pack.html +++ b/git-receive-pack.html
@@ -1084,7 +1084,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-reflog.html b/git-reflog.html index c266148..ff3bf77 100644 --- a/git-reflog.html +++ b/git-reflog.html
@@ -929,7 +929,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-remote-ext.html b/git-remote-ext.html index fdb9d8c..aa4966a 100644 --- a/git-remote-ext.html +++ b/git-remote-ext.html
@@ -963,7 +963,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-remote-fd.html b/git-remote-fd.html index 37b6f48..71dd637 100644 --- a/git-remote-fd.html +++ b/git-remote-fd.html
@@ -843,7 +843,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-remote-helpers.html b/git-remote-helpers.html index 0505934..6c3c408 100644 --- a/git-remote-helpers.html +++ b/git-remote-helpers.html
@@ -750,7 +750,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-remote.html b/git-remote.html index 51129fe..99b4e39 100644 --- a/git-remote.html +++ b/git-remote.html
@@ -1055,7 +1055,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-09 14:46:20 PST + 2020-11-10 07:46:20 JST </div> </div> </body>
diff --git a/git-repack.html b/git-repack.html index 807d413..980cffd 100644 --- a/git-repack.html +++ b/git-repack.html
@@ -1070,7 +1070,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-24 15:15:46 PDT + 2021-03-25 07:15:46 JST </div> </div> </body>
diff --git a/git-replace.html b/git-replace.html index 625cd6e..b323b6c 100644 --- a/git-replace.html +++ b/git-replace.html
@@ -971,7 +971,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-request-pull.html b/git-request-pull.html index 1251abb..22a238a 100644 --- a/git-request-pull.html +++ b/git-request-pull.html
@@ -855,7 +855,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-rerere.html b/git-rerere.html index f1e6580..48c8293 100644 --- a/git-rerere.html +++ b/git-rerere.html
@@ -990,7 +990,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-reset.html b/git-reset.html index 83c4f81..6c3e38f 100644 --- a/git-reset.html +++ b/git-reset.html
@@ -1499,7 +1499,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-04-29 14:18:27 PDT + 2020-04-30 06:18:27 JST </div> </div> </body>
diff --git a/git-restore.html b/git-restore.html index a60693b..a434323 100644 --- a/git-restore.html +++ b/git-restore.html
@@ -1074,7 +1074,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-27 15:58:27 PDT + 2020-10-28 07:58:27 JST </div> </div> </body>
diff --git a/git-rev-list.html b/git-rev-list.html index f6c134e..ed49781 100644 --- a/git-rev-list.html +++ b/git-rev-list.html
@@ -3593,7 +3593,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-rev-parse.html b/git-rev-parse.html index 6ab2899..e6739d6 100644 --- a/git-rev-parse.html +++ b/git-rev-parse.html
@@ -2045,7 +2045,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-15 16:12:09 PST + 2021-01-16 09:12:09 JST </div> </div> </body>
diff --git a/git-revert.html b/git-revert.html index 89486b5..f540973 100644 --- a/git-revert.html +++ b/git-revert.html
@@ -1022,7 +1022,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-rm.html b/git-rm.html index 28d8f95..9298e14 100644 --- a/git-rm.html +++ b/git-rm.html
@@ -1020,7 +1020,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-send-email.html b/git-send-email.html index c603a27..eabc3b5 100644 --- a/git-send-email.html +++ b/git-send-email.html
@@ -1631,7 +1631,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-25 15:29:19 PST + 2021-01-26 08:29:19 JST </div> </div> </body>
diff --git a/git-send-pack.html b/git-send-pack.html index dd2ef90..40cf93e 100644 --- a/git-send-pack.html +++ b/git-send-pack.html
@@ -993,7 +993,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-sh-i18n--envsubst.html b/git-sh-i18n--envsubst.html index a49bda3..43c4f7a 100644 --- a/git-sh-i18n--envsubst.html +++ b/git-sh-i18n--envsubst.html
@@ -785,7 +785,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-sh-i18n.html b/git-sh-i18n.html index 603089e..34972a0 100644 --- a/git-sh-i18n.html +++ b/git-sh-i18n.html
@@ -807,7 +807,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-sh-setup.html b/git-sh-setup.html index 5c19dca..4c369bc 100644 --- a/git-sh-setup.html +++ b/git-sh-setup.html
@@ -902,7 +902,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-06-27 11:04:05 PDT + 2016-06-28 03:04:05 JST </div> </div> </body>
diff --git a/git-shell.html b/git-shell.html index dba8847..d9938c3 100644 --- a/git-shell.html +++ b/git-shell.html
@@ -873,7 +873,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-shortlog.html b/git-shortlog.html index e46788e..54b38ab 100644 --- a/git-shortlog.html +++ b/git-shortlog.html
@@ -1956,7 +1956,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-22 16:54:23 PST + 2021-02-23 09:54:23 JST </div> </div> </body>
diff --git a/git-show-branch.html b/git-show-branch.html index fd92986..5577bd9 100644 --- a/git-show-branch.html +++ b/git-show-branch.html
@@ -1047,7 +1047,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-show-index.html b/git-show-index.html index 0a158cc..bd12264 100644 --- a/git-show-index.html +++ b/git-show-index.html
@@ -824,7 +824,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-24 15:54:20 PDT + 2020-08-25 07:54:20 JST </div> </div> </body>
diff --git a/git-show-ref.html b/git-show-ref.html index 7f58a66..046742c 100644 --- a/git-show-ref.html +++ b/git-show-ref.html
@@ -977,7 +977,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-show.html b/git-show.html index 3c4fdce..a7ba39e 100644 --- a/git-show.html +++ b/git-show.html
@@ -1934,7 +1934,7 @@ </p> </dd> <dt class="hdlist1"> ---diff-merges=(off|none|first-parent|1|separate|m|combined|c|dense-combined|cc) +--diff-merges=(off|none|on|first-parent|1|separate|m|combined|c|dense-combined|cc) </dt> <dt class="hdlist1"> --no-diff-merges @@ -1959,6 +1959,24 @@ </p> </dd> <dt class="hdlist1"> +--diff-merges=on +</dt> +<dt class="hdlist1"> +--diff-merges=m +</dt> +<dt class="hdlist1"> +-m +</dt> +<dd> +<p> + This option makes diff output for merge commits to be shown in + the default format. <code>-m</code> will produce the output only if <code>-p</code> + is given as well. The default format could be changed using + <code>log.diffMerges</code> configuration parameter, which default value + is <code>separate</code>. +</p> +</dd> +<dt class="hdlist1"> --diff-merges=first-parent </dt> <dt class="hdlist1"> @@ -1973,17 +1991,11 @@ <dt class="hdlist1"> --diff-merges=separate </dt> -<dt class="hdlist1"> ---diff-merges=m -</dt> -<dt class="hdlist1"> --m -</dt> <dd> <p> This makes merge commits show the full diff with respect to each of the parents. Separate log entry and diff is generated - for each parent. <code>-m</code> doesn’t produce any output without <code>-p</code>. + for each parent. </p> </dd> <dt class="hdlist1"> @@ -2398,7 +2410,9 @@ </dt> <dd> <p> - Show only names of changed files. + Show only names of changed files. The file names are often encoded in UTF-8. + For more information see the discussion about encoding in the <a href="git-log.html">git-log(1)</a> + manual page. </p> </dd> <dt class="hdlist1"> @@ -2408,6 +2422,7 @@ <p> Show only names and status of changed files. See the description of the <code>--diff-filter</code> option on what the status letters mean. + Just like <code>--name-only</code> the file names are often encoded in UTF-8. </p> </dd> <dt class="hdlist1"> @@ -3658,7 +3673,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-05 17:34:58 PST + 2021-02-06 10:34:58 JST </div> </div> </body>
diff --git a/git-sparse-checkout.html b/git-sparse-checkout.html index 893530e..3181cc4 100644 --- a/git-sparse-checkout.html +++ b/git-sparse-checkout.html
@@ -794,6 +794,18 @@ <div class="paragraph"><p>When <code>--cone</code> is provided, the <code>core.sparseCheckoutCone</code> setting is also set, allowing for better performance with a limited set of patterns (see <em>CONE PATTERN SET</em> below).</p></div> +<div class="paragraph"><p>Use the <code>--[no-]sparse-index</code> option to toggle the use of the sparse +index format. This reduces the size of the index to be more closely +aligned with your sparse-checkout definition. This can have significant +performance advantages for commands such as <code>git status</code> or <code>git add</code>. +This feature is still experimental. Some commands might be slower with +a sparse index until they are properly integrated with the feature.</p></div> +<div class="paragraph"><p><strong>WARNING:</strong> Using a sparse index requires modifying the index in a way +that is not completely understood by external tools. If you have trouble +with this compatibility, then run <code>git sparse-checkout init --no-sparse-index</code> +to rewrite your index to not be sparse. Older versions of Git will not +understand the sparse directory entries index extension and may fail to +interact with your repository until it is disabled.</p></div> </dd> <dt class="hdlist1"> <em>set</em> @@ -1009,7 +1021,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-06-22 16:55:13 PDT + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/git-sparse-checkout.txt b/git-sparse-checkout.txt index a0eeaeb..fdcf43f 100644 --- a/git-sparse-checkout.txt +++ b/git-sparse-checkout.txt
@@ -45,6 +45,20 @@ When `--cone` is provided, the `core.sparseCheckoutCone` setting is also set, allowing for better performance with a limited set of patterns (see 'CONE PATTERN SET' below). ++ +Use the `--[no-]sparse-index` option to toggle the use of the sparse +index format. This reduces the size of the index to be more closely +aligned with your sparse-checkout definition. This can have significant +performance advantages for commands such as `git status` or `git add`. +This feature is still experimental. Some commands might be slower with +a sparse index until they are properly integrated with the feature. ++ +**WARNING:** Using a sparse index requires modifying the index in a way +that is not completely understood by external tools. If you have trouble +with this compatibility, then run `git sparse-checkout init --no-sparse-index` +to rewrite your index to not be sparse. Older versions of Git will not +understand the sparse directory entries index extension and may fail to +interact with your repository until it is disabled. 'set':: Write a set of patterns to the sparse-checkout file, as given as
diff --git a/git-stage.html b/git-stage.html index 506e612..6c2d976 100644 --- a/git-stage.html +++ b/git-stage.html
@@ -772,7 +772,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2014-10-20 14:13:43 PDT + 2014-10-21 06:13:43 JST </div> </div> </body>
diff --git a/git-stash.html b/git-stash.html index 9318b12..d95469d 100644 --- a/git-stash.html +++ b/git-stash.html
@@ -1245,7 +1245,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-22 14:17:33 PDT + 2021-03-23 06:17:33 JST </div> </div> </body>
diff --git a/git-status.html b/git-status.html index 8035b75..f4623f8 100644 --- a/git-status.html +++ b/git-status.html
@@ -1361,7 +1361,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-stripspace.html b/git-stripspace.html index 8b27dd5..4db3ac3 100644 --- a/git-stripspace.html +++ b/git-stripspace.html
@@ -876,7 +876,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2015-10-26 16:13:38 PDT + 2015-10-27 08:13:38 JST </div> </div> </body>
diff --git a/git-submodule.html b/git-submodule.html index c32b9a4..11bfd82 100644 --- a/git-submodule.html +++ b/git-submodule.html
@@ -1407,7 +1407,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-07-06 22:33:22 PDT + 2020-07-07 14:33:22 JST </div> </div> </body>
diff --git a/git-svn.html b/git-svn.html index c198485..490412d 100644 --- a/git-svn.html +++ b/git-svn.html
@@ -2517,7 +2517,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-02 14:02:22 PST + 2020-11-03 07:02:22 JST </div> </div> </body>
diff --git a/git-switch.html b/git-switch.html index d27186c..22a8180 100644 --- a/git-switch.html +++ b/git-switch.html
@@ -1127,7 +1127,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-27 15:58:27 PDT + 2020-10-28 07:58:27 JST </div> </div> </body>
diff --git a/git-symbolic-ref.html b/git-symbolic-ref.html index 4264537..a83bb9b 100644 --- a/git-symbolic-ref.html +++ b/git-symbolic-ref.html
@@ -847,7 +847,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-tag.html b/git-tag.html index 61c853b..33d5f88 100644 --- a/git-tag.html +++ b/git-tag.html
@@ -1339,7 +1339,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/git-unpack-file.html b/git-unpack-file.html index 44bf6db..ef61ee5 100644 --- a/git-unpack-file.html +++ b/git-unpack-file.html
@@ -788,7 +788,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git-unpack-objects.html b/git-unpack-objects.html index e623a7a..b49625d 100644 --- a/git-unpack-objects.html +++ b/git-unpack-objects.html
@@ -830,7 +830,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-09-12 17:53:34 PDT + 2016-09-13 09:53:34 JST </div> </div> </body>
diff --git a/git-update-index.html b/git-update-index.html index 7f44b70..ef127e9 100644 --- a/git-update-index.html +++ b/git-update-index.html
@@ -1518,7 +1518,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-25 15:29:19 PST + 2021-01-26 08:29:19 JST </div> </div> </body>
diff --git a/git-update-ref.html b/git-update-ref.html index db27f94..22bef61 100644 --- a/git-update-ref.html +++ b/git-update-ref.html
@@ -974,7 +974,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-12-08 16:10:07 PST + 2020-12-09 09:10:07 JST </div> </div> </body>
diff --git a/git-update-server-info.html b/git-update-server-info.html index b985798..99ffe8b 100644 --- a/git-update-server-info.html +++ b/git-update-server-info.html
@@ -795,7 +795,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-upload-archive.html b/git-upload-archive.html index f3e825c..b077afe 100644 --- a/git-upload-archive.html +++ b/git-upload-archive.html
@@ -832,7 +832,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2015-10-29 14:44:28 PDT + 2015-10-30 06:44:28 JST </div> </div> </body>
diff --git a/git-upload-pack.html b/git-upload-pack.html index bceb323..ba242df 100644 --- a/git-upload-pack.html +++ b/git-upload-pack.html
@@ -834,7 +834,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-var.html b/git-var.html index b903ada..7bd3e3c 100644 --- a/git-var.html +++ b/git-var.html
@@ -856,7 +856,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-verify-commit.html b/git-verify-commit.html index cdc047b..2709ee5 100644 --- a/git-verify-commit.html +++ b/git-verify-commit.html
@@ -806,7 +806,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-06-27 11:04:05 PDT + 2016-06-28 03:04:05 JST </div> </div> </body>
diff --git a/git-verify-pack.html b/git-verify-pack.html index 2562ee1..ff2bb5f 100644 --- a/git-verify-pack.html +++ b/git-verify-pack.html
@@ -836,7 +836,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2015-05-22 13:47:07 PDT + 2015-05-23 05:47:07 JST </div> </div> </body>
diff --git a/git-verify-tag.html b/git-verify-tag.html index 75e9ee1..a23a783 100644 --- a/git-verify-tag.html +++ b/git-verify-tag.html
@@ -806,7 +806,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2017-01-31 14:00:53 PST + 2017-02-01 07:00:53 JST </div> </div> </body>
diff --git a/git-web--browse.html b/git-web--browse.html index 4faabd1..c088f7b 100644 --- a/git-web--browse.html +++ b/git-web--browse.html
@@ -964,7 +964,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/git-whatchanged.html b/git-whatchanged.html index 99e6e5d..28f879a 100644 --- a/git-whatchanged.html +++ b/git-whatchanged.html
@@ -803,7 +803,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-30 16:51:59 PDT + 2013-08-31 08:51:59 JST </div> </div> </body>
diff --git a/git-worktree.html b/git-worktree.html index bdd1df1..4b550a2 100644 --- a/git-worktree.html +++ b/git-worktree.html
@@ -1360,7 +1360,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-10 15:27:55 PST + 2021-02-11 08:27:55 JST </div> </div> </body>
diff --git a/git-write-tree.html b/git-write-tree.html index cd6b1a4..e5f6e53 100644 --- a/git-write-tree.html +++ b/git-write-tree.html
@@ -805,7 +805,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/git.html b/git.html index be88852..e5a09c3 100644 --- a/git.html +++ b/git.html
@@ -3613,7 +3613,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/gitattributes.html b/gitattributes.html index 249f123..f1c4922 100644 --- a/gitattributes.html +++ b/gitattributes.html
@@ -1677,6 +1677,11 @@ </li> <li> <p> +<code>scheme</code> suitable for source code in the Scheme language. +</p> +</li> +<li> +<p> <code>tex</code> suitable for source code for LaTeX documents. </p> </li> @@ -2182,7 +2187,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-22 14:17:33 PDT + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/gitattributes.txt b/gitattributes.txt index 0a60472..cfcfa80 100644 --- a/gitattributes.txt +++ b/gitattributes.txt
@@ -845,6 +845,8 @@ - `rust` suitable for source code in the Rust language. +- `scheme` suitable for source code in the Scheme language. + - `tex` suitable for source code for LaTeX documents.
diff --git a/gitcli.html b/gitcli.html index 65322cb..a4538ad 100644 --- a/gitcli.html +++ b/gitcli.html
@@ -1040,7 +1040,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-11 14:26:57 PDT + 2020-03-12 06:26:57 JST </div> </div> </body>
diff --git a/gitcore-tutorial.html b/gitcore-tutorial.html index ff3309c..2b7c718 100644 --- a/gitcore-tutorial.html +++ b/gitcore-tutorial.html
@@ -2458,7 +2458,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/gitcredentials.html b/gitcredentials.html index 0a227f6..c3d2279 100644 --- a/gitcredentials.html +++ b/gitcredentials.html
@@ -1106,7 +1106,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-10 16:30:08 PDT + 2020-08-11 08:30:08 JST </div> </div> </body>
diff --git a/gitcvs-migration.html b/gitcvs-migration.html index 7967680..d703164 100644 --- a/gitcvs-migration.html +++ b/gitcvs-migration.html
@@ -957,7 +957,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2017-02-15 15:17:51 PST + 2017-02-16 08:17:51 JST </div> </div> </body>
diff --git a/gitdiffcore.html b/gitdiffcore.html index 0f83ea5..0101065 100644 --- a/gitdiffcore.html +++ b/gitdiffcore.html
@@ -1108,7 +1108,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-22 14:17:33 PDT + 2021-03-23 06:17:33 JST </div> </div> </body>
diff --git a/giteveryday.html b/giteveryday.html index bb922d7..ae076e4 100644 --- a/giteveryday.html +++ b/giteveryday.html
@@ -1546,7 +1546,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-07-06 22:33:22 PDT + 2020-07-07 14:33:22 JST </div> </div> </body>
diff --git a/gitfaq.html b/gitfaq.html index 90af707..3f9ef4f 100644 --- a/gitfaq.html +++ b/gitfaq.html
@@ -1262,7 +1262,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-09-29 14:47:55 PDT + 2020-09-30 06:47:55 JST </div> </div> </body>
diff --git a/gitglossary.html b/gitglossary.html index 52bb5d5..a486745 100644 --- a/gitglossary.html +++ b/gitglossary.html
@@ -1921,7 +1921,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2017-02-15 15:17:51 PST + 2017-02-16 08:17:51 JST </div> </div> </body>
diff --git a/githooks.html b/githooks.html index 4d422de..38cfaa9 100644 --- a/githooks.html +++ b/githooks.html
@@ -1377,7 +1377,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-22 14:17:33 PDT + 2021-03-23 06:17:33 JST </div> </div> </body>
diff --git a/gitignore.html b/gitignore.html index 876bf28..850cb99 100644 --- a/gitignore.html +++ b/gitignore.html
@@ -1069,7 +1069,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-22 14:17:33 PDT + 2021-03-23 06:17:33 JST </div> </div> </body>
diff --git a/gitk.html b/gitk.html index 8b06f19..2365db7 100644 --- a/gitk.html +++ b/gitk.html
@@ -1101,7 +1101,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-11-18 14:12:24 PST + 2020-11-19 07:12:24 JST </div> </div> </body>
diff --git a/gitmailmap.html b/gitmailmap.html index 35f1707..7e1a490 100644 --- a/gitmailmap.html +++ b/gitmailmap.html
@@ -884,7 +884,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/gitmodules.html b/gitmodules.html index 625bc0d..2e5d2c8 100644 --- a/gitmodules.html +++ b/gitmodules.html
@@ -938,7 +938,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-01-15 16:12:09 PST + 2021-01-16 09:12:09 JST </div> </div> </body>
diff --git a/gitnamespaces.html b/gitnamespaces.html index 794c2e3..a1f9bff 100644 --- a/gitnamespaces.html +++ b/gitnamespaces.html
@@ -844,7 +844,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2017-01-10 15:42:58 PST + 2017-01-11 08:42:58 JST </div> </div> </body>
diff --git a/gitremote-helpers.html b/gitremote-helpers.html index e788059..f505c45 100644 --- a/gitremote-helpers.html +++ b/gitremote-helpers.html
@@ -1518,7 +1518,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-07-06 22:33:22 PDT + 2020-07-07 14:33:22 JST </div> </div> </body>
diff --git a/gitrepository-layout.html b/gitrepository-layout.html index 53e0522..b3bfa9a 100644 --- a/gitrepository-layout.html +++ b/gitrepository-layout.html
@@ -1372,7 +1372,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/gitrevisions.html b/gitrevisions.html index 23a1a49..f0cf521 100644 --- a/gitrevisions.html +++ b/gitrevisions.html
@@ -1324,7 +1324,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/gitsubmodules.html b/gitsubmodules.html index 70dd427..23e98dc 100644 --- a/gitsubmodules.html +++ b/gitsubmodules.html
@@ -1113,7 +1113,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-10-05 15:17:53 PDT + 2020-10-06 07:17:53 JST </div> </div> </body>
diff --git a/gittutorial-2.html b/gittutorial-2.html index adb66df..b050d37 100644 --- a/gittutorial-2.html +++ b/gittutorial-2.html
@@ -1171,7 +1171,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/gittutorial.html b/gittutorial.html index 1914190..91cf0bc 100644 --- a/gittutorial.html +++ b/gittutorial.html
@@ -1375,7 +1375,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/gitweb.conf.html b/gitweb.conf.html index bdf9d94..90cc8ee 100644 --- a/gitweb.conf.html +++ b/gitweb.conf.html
@@ -2015,7 +2015,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-13 17:34:18 PDT + 2021-04-14 09:34:18 JST </div> </div> </body>
diff --git a/gitweb.html b/gitweb.html index 9fa10d1..ff428c3 100644 --- a/gitweb.html +++ b/gitweb.html
@@ -1642,7 +1642,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/gitworkflows.html b/gitworkflows.html index f188ee4..9e711aa 100644 --- a/gitworkflows.html +++ b/gitworkflows.html
@@ -1225,7 +1225,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-07-18 17:57:39 PDT + 2020-07-19 09:57:39 JST </div> </div> </body>
diff --git a/howto/coordinate-embargoed-releases.html b/howto/coordinate-embargoed-releases.html index 8068c7d..7e9b9d7 100644 --- a/howto/coordinate-embargoed-releases.html +++ b/howto/coordinate-embargoed-releases.html
@@ -873,7 +873,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:14 PDT + 2021-04-30 15:04:59 JST </div> </div> </body>
diff --git a/howto/keep-canonical-history-correct.html b/howto/keep-canonical-history-correct.html index 422f665..7435aa8 100644 --- a/howto/keep-canonical-history-correct.html +++ b/howto/keep-canonical-history-correct.html
@@ -938,7 +938,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:13 PDT + 2021-04-30 15:04:59 JST </div> </div> </body>
diff --git a/howto/maintain-git.html b/howto/maintain-git.html index 14c705e..8370340 100644 --- a/howto/maintain-git.html +++ b/howto/maintain-git.html
@@ -1469,7 +1469,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:14 PDT + 2021-04-30 15:04:59 JST </div> </div> </body>
diff --git a/howto/new-command.html b/howto/new-command.html index 995c07d..74093a4 100644 --- a/howto/new-command.html +++ b/howto/new-command.html
@@ -863,7 +863,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:09 PDT + 2021-04-30 15:04:53 JST </div> </div> </body>
diff --git a/howto/rebase-from-internal-branch.html b/howto/rebase-from-internal-branch.html index 8cd7e68..5621547 100644 --- a/howto/rebase-from-internal-branch.html +++ b/howto/rebase-from-internal-branch.html
@@ -895,7 +895,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:13 PDT + 2021-04-30 15:04:59 JST </div> </div> </body>
diff --git a/howto/rebuild-from-update-hook.html b/howto/rebuild-from-update-hook.html index 0e42c77..470bef0 100644 --- a/howto/rebuild-from-update-hook.html +++ b/howto/rebuild-from-update-hook.html
@@ -847,7 +847,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:13 PDT + 2021-04-30 15:04:58 JST </div> </div> </body>
diff --git a/howto/recover-corrupted-blob-object.html b/howto/recover-corrupted-blob-object.html index ce339e0..c83e5be 100644 --- a/howto/recover-corrupted-blob-object.html +++ b/howto/recover-corrupted-blob-object.html
@@ -880,7 +880,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:12 PDT + 2021-04-30 15:04:57 JST </div> </div> </body>
diff --git a/howto/recover-corrupted-object-harder.html b/howto/recover-corrupted-object-harder.html index df6ebca..372365d 100644 --- a/howto/recover-corrupted-object-harder.html +++ b/howto/recover-corrupted-object-harder.html
@@ -1189,7 +1189,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:13 PDT + 2021-04-30 15:04:58 JST </div> </div> </body>
diff --git a/howto/revert-a-faulty-merge.html b/howto/revert-a-faulty-merge.html index 55cfa5a..84b673a 100644 --- a/howto/revert-a-faulty-merge.html +++ b/howto/revert-a-faulty-merge.html
@@ -1025,7 +1025,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:12 PDT + 2021-04-30 15:04:57 JST </div> </div> </body>
diff --git a/howto/revert-branch-rebase.html b/howto/revert-branch-rebase.html index 8303263..54150bf 100644 --- a/howto/revert-branch-rebase.html +++ b/howto/revert-branch-rebase.html
@@ -907,7 +907,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:09 PDT + 2021-04-30 15:04:53 JST </div> </div> </body>
diff --git a/howto/separating-topic-branches.html b/howto/separating-topic-branches.html index 23fd4f3..aad0aef 100644 --- a/howto/separating-topic-branches.html +++ b/howto/separating-topic-branches.html
@@ -841,7 +841,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:11 PDT + 2021-04-30 15:04:56 JST </div> </div> </body>
diff --git a/howto/setup-git-server-over-http.html b/howto/setup-git-server-over-http.html index 1a99cb6..90a3de1 100644 --- a/howto/setup-git-server-over-http.html +++ b/howto/setup-git-server-over-http.html
@@ -1071,7 +1071,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:11 PDT + 2021-04-30 15:04:56 JST </div> </div> </body>
diff --git a/howto/update-hook-example.html b/howto/update-hook-example.html index c342ca3..7e53563 100644 --- a/howto/update-hook-example.html +++ b/howto/update-hook-example.html
@@ -930,7 +930,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:10 PDT + 2021-04-30 15:04:55 JST </div> </div> </body>
diff --git a/howto/use-git-daemon.html b/howto/use-git-daemon.html index c5442b6..8d66c93 100644 --- a/howto/use-git-daemon.html +++ b/howto/use-git-daemon.html
@@ -791,7 +791,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:10 PDT + 2021-04-30 15:04:55 JST </div> </div> </body>
diff --git a/howto/using-merge-subtree.html b/howto/using-merge-subtree.html index ca1f2de..12896dd 100644 --- a/howto/using-merge-subtree.html +++ b/howto/using-merge-subtree.html
@@ -848,7 +848,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:09 PDT + 2021-04-30 15:04:54 JST </div> </div> </body>
diff --git a/howto/using-signed-tag-in-pull-request.html b/howto/using-signed-tag-in-pull-request.html index fae3f9e..832af20 100644 --- a/howto/using-signed-tag-in-pull-request.html +++ b/howto/using-signed-tag-in-pull-request.html
@@ -952,7 +952,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-16 15:13:10 PDT + 2021-04-30 15:04:54 JST </div> </div> </body>
diff --git a/technical/api-error-handling.html b/technical/api-error-handling.html index b3058e0..ec6b339 100644 --- a/technical/api-error-handling.html +++ b/technical/api-error-handling.html
@@ -739,11 +739,17 @@ <div id="content"> <div id="preamble"> <div class="sectionbody"> -<div class="paragraph"><p><code>die</code>, <code>usage</code>, <code>error</code>, and <code>warning</code> report errors of various -kinds.</p></div> +<div class="paragraph"><p><code>BUG</code>, <code>die</code>, <code>usage</code>, <code>error</code>, and <code>warning</code> report errors of +various kinds.</p></div> <div class="ulist"><ul> <li> <p> +<code>BUG</code> is for failed internal assertions that should never happen, + i.e. a bug in git itself. +</p> +</li> +<li> +<p> <code>die</code> is for fatal application errors. It prints a message to the user and exits with status 128. </p> @@ -771,6 +777,8 @@ </p> </li> </ul></div> +<div class="paragraph"><p>These reports will be logged via the trace2 facility. See the "error" +event in <a href="api-trace2.txt">trace2 API</a>.</p></div> </div> </div> <div class="sect1"> @@ -849,7 +857,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2015-03-28 11:17:28 PDT + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/technical/api-error-handling.txt b/technical/api-error-handling.txt index ceeedd4..8be4f4d 100644 --- a/technical/api-error-handling.txt +++ b/technical/api-error-handling.txt
@@ -1,8 +1,11 @@ Error reporting in git ====================== -`die`, `usage`, `error`, and `warning` report errors of various -kinds. +`BUG`, `die`, `usage`, `error`, and `warning` report errors of +various kinds. + +- `BUG` is for failed internal assertions that should never happen, + i.e. a bug in git itself. - `die` is for fatal application errors. It prints a message to the user and exits with status 128. @@ -20,6 +23,9 @@ without running into too many problems. Like `error`, it returns -1 after reporting the situation to the caller. +These reports will be logged via the trace2 facility. See the "error" +event in link:api-trace2.txt[trace2 API]. + Customizable error handlers ---------------------------
diff --git a/technical/api-index.html b/technical/api-index.html index d820c3a..72f03a4 100644 --- a/technical/api-index.html +++ b/technical/api-index.html
@@ -775,7 +775,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-02 15:10:16 PDT + 2021-04-03 07:10:16 JST </div> </div> </body>
diff --git a/technical/api-merge.html b/technical/api-merge.html index b2ddb05..d6f544e 100644 --- a/technical/api-merge.html +++ b/technical/api-merge.html
@@ -801,7 +801,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/technical/api-parse-options.html b/technical/api-parse-options.html index f22b69f..71e44b7 100644 --- a/technical/api-parse-options.html +++ b/technical/api-parse-options.html
@@ -1290,7 +1290,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-10 16:30:08 PDT + 2020-08-11 08:30:08 JST </div> </div> </body>
diff --git a/technical/api-simple-ipc.html b/technical/api-simple-ipc.html index d999566..d1c9426 100644 --- a/technical/api-simple-ipc.html +++ b/technical/api-simple-ipc.html
@@ -840,7 +840,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-02 15:10:10 PDT + 2021-04-03 07:10:10 JST </div> </div> </body>
diff --git a/technical/api-trace2.html b/technical/api-trace2.html index f0be56a..5044b0c 100644 --- a/technical/api-trace2.html +++ b/technical/api-trace2.html
@@ -1337,7 +1337,7 @@ </dt> <dd> <p> - This event is emitted when one of the <code>error()</code>, <code>die()</code>, + This event is emitted when one of the <code>BUG()</code>, <code>error()</code>, <code>die()</code>, <code>warning()</code>, or <code>usage()</code> functions are called. </p> <div class="listingblock"> @@ -2156,7 +2156,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-12-08 16:10:07 PST + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/technical/api-trace2.txt b/technical/api-trace2.txt index c65ffaf..3f52f98 100644 --- a/technical/api-trace2.txt +++ b/technical/api-trace2.txt
@@ -465,7 +465,7 @@ ------------ `"error"`:: - This event is emitted when one of the `error()`, `die()`, + This event is emitted when one of the `BUG()`, `error()`, `die()`, `warning()`, or `usage()` functions are called. + ------------
diff --git a/technical/hash-function-transition.html b/technical/hash-function-transition.html index 0c3904b..2513d08 100644 --- a/technical/hash-function-transition.html +++ b/technical/hash-function-transition.html
@@ -2087,7 +2087,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-22 16:54:23 PST + 2021-02-23 09:54:23 JST </div> </div> </body>
diff --git a/technical/http-protocol.html b/technical/http-protocol.html index d3b848c..39d6e2d 100644 --- a/technical/http-protocol.html +++ b/technical/http-protocol.html
@@ -1248,7 +1248,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-19 16:37:10 PDT + 2020-08-20 08:37:10 JST </div> </div> </body>
diff --git a/technical/index-format.html b/technical/index-format.html index b5eab20..cc6c9db 100644 --- a/technical/index-format.html +++ b/technical/index-format.html
@@ -820,6 +820,15 @@ </div></div> <div class="literalblock"> <div class="content"> +<pre><code>An index entry typically represents a file. However, if sparse-checkout +is enabled in cone mode (`core.sparseCheckoutCone` is enabled) and the +`extensions.sparseIndex` extension is enabled, then the index may +contain entries for directories outside of the sparse-checkout definition. +These entries have mode `040000`, include the `SKIP_WORKTREE` bit, and +the path ends in a directory separator.</code></pre> +</div></div> +<div class="literalblock"> +<div class="content"> <pre><code>32-bit ctime seconds, the last time a file's metadata changed this is stat(2) data</code></pre> </div></div> @@ -1433,12 +1442,29 @@ </ul></div> </div> </div> +<div class="sect1"> +<h2 id="_sparse_directory_entries">Sparse Directory Entries</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre><code>When using sparse-checkout in cone mode, some entire directories within +the index can be summarized by pointing to a tree object instead of the +entire expanded list of paths within that tree. An index containing such +entries is a "sparse index". Index format versions 4 and less were not +implemented with such entries in mind. Thus, for these versions, an +index containing sparse directory entries will include this extension +with signature { 's', 'd', 'i', 'r' }. Like the split-index extension, +tools should avoid interacting with a sparse index unless they understand +this extension.</code></pre> +</div></div> +</div> +</div> </div> <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/technical/index-format.txt b/technical/index-format.txt index d363a71..65da0da 100644 --- a/technical/index-format.txt +++ b/technical/index-format.txt
@@ -44,6 +44,13 @@ localization, no special casing of directory separator '/'). Entries with the same name are sorted by their stage field. + An index entry typically represents a file. However, if sparse-checkout + is enabled in cone mode (`core.sparseCheckoutCone` is enabled) and the + `extensions.sparseIndex` extension is enabled, then the index may + contain entries for directories outside of the sparse-checkout definition. + These entries have mode `040000`, include the `SKIP_WORKTREE` bit, and + the path ends in a directory separator. + 32-bit ctime seconds, the last time a file's metadata changed this is stat(2) data @@ -385,3 +392,15 @@ in this block of entries. - 32-bit count of cache entries in this block + +== Sparse Directory Entries + + When using sparse-checkout in cone mode, some entire directories within + the index can be summarized by pointing to a tree object instead of the + entire expanded list of paths within that tree. An index containing such + entries is a "sparse index". Index format versions 4 and less were not + implemented with such entries in mind. Thus, for these versions, an + index containing sparse directory entries will include this extension + with signature { 's', 'd', 'i', 'r' }. Like the split-index extension, + tools should avoid interacting with a sparse index unless they understand + this extension.
diff --git a/technical/long-running-process-protocol.html b/technical/long-running-process-protocol.html index 730362b..79d2b02 100644 --- a/technical/long-running-process-protocol.html +++ b/technical/long-running-process-protocol.html
@@ -795,7 +795,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/technical/multi-pack-index.html b/technical/multi-pack-index.html index 4c337fb..e0220db 100644 --- a/technical/multi-pack-index.html +++ b/technical/multi-pack-index.html
@@ -913,7 +913,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-08 14:45:29 PDT + 2021-04-09 06:45:29 JST </div> </div> </body>
diff --git a/technical/pack-format.html b/technical/pack-format.html index b300242..c0f964a 100644 --- a/technical/pack-format.html +++ b/technical/pack-format.html
@@ -1372,7 +1372,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-04-08 14:45:29 PDT + 2021-04-09 06:45:29 JST </div> </div> </body>
diff --git a/technical/pack-heuristics.html b/technical/pack-heuristics.html index 3e6da3f..bd50aee 100644 --- a/technical/pack-heuristics.html +++ b/technical/pack-heuristics.html
@@ -1343,7 +1343,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2014-01-13 15:35:15 PST + 2014-01-14 08:35:15 JST </div> </div> </body>
diff --git a/technical/pack-protocol.html b/technical/pack-protocol.html index ff37433..4cb047d 100644 --- a/technical/pack-protocol.html +++ b/technical/pack-protocol.html
@@ -1470,7 +1470,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-09-25 15:47:14 PDT + 2020-09-26 07:47:14 JST </div> </div> </body>
diff --git a/technical/parallel-checkout.html b/technical/parallel-checkout.html new file mode 100644 index 0000000..c575bb4 --- /dev/null +++ b/technical/parallel-checkout.html
@@ -0,0 +1,1082 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> +<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> +<meta name="generator" content="AsciiDoc 9.0.0rc2" /> +<title>Parallel Checkout Design Notes</title> +<style type="text/css"> +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */ + +/* Default font. */ +body { + font-family: Georgia,serif; +} + +/* Title font. */ +h1, h2, h3, h4, h5, h6, +div.title, caption.title, +thead, p.table.header, +#toctitle, +#author, #revnumber, #revdate, #revremark, +#footer { + font-family: Arial,Helvetica,sans-serif; +} + +body { + margin: 1em 5% 1em 5%; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: fuchsia; +} + +em { + font-style: italic; + color: navy; +} + +strong { + font-weight: bold; + color: #083194; +} + +h1, h2, h3, h4, h5, h6 { + color: #527bbd; + margin-top: 1.2em; + margin-bottom: 0.5em; + line-height: 1.3; +} + +h1, h2, h3 { + border-bottom: 2px solid silver; +} +h2 { + padding-top: 0.5em; +} +h3 { + float: left; +} +h3 + * { + clear: left; +} +h5 { + font-size: 1.0em; +} + +div.sectionbody { + margin-left: 0; +} + +hr { + border: 1px solid silver; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +ul, ol, li > p { + margin-top: 0; +} +ul > li { color: #aaa; } +ul > li > * { color: black; } + +.monospaced, code, pre { + font-family: "Courier New", Courier, monospace; + font-size: inherit; + color: navy; + padding: 0; + margin: 0; +} +pre { + white-space: pre-wrap; +} + +#author { + color: #527bbd; + font-weight: bold; + font-size: 1.1em; +} +#email { +} +#revnumber, #revdate, #revremark { +} + +#footer { + font-size: small; + border-top: 2px solid silver; + padding-top: 0.5em; + margin-top: 4.0em; +} +#footer-text { + float: left; + padding-bottom: 0.5em; +} +#footer-badges { + float: right; + padding-bottom: 0.5em; +} + +#preamble { + margin-top: 1.5em; + margin-bottom: 1.5em; +} +div.imageblock, div.exampleblock, div.verseblock, +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, +div.admonitionblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.admonitionblock { + margin-top: 2.0em; + margin-bottom: 2.0em; + margin-right: 10%; + color: #606060; +} + +div.content { /* Block element content. */ + padding: 0; +} + +/* Block element titles. */ +div.title, caption.title { + color: #527bbd; + font-weight: bold; + text-align: left; + margin-top: 1.0em; + margin-bottom: 0.5em; +} +div.title + * { + margin-top: 0; +} + +td div.title:first-child { + margin-top: 0.0em; +} +div.content div.title:first-child { + margin-top: 0.0em; +} +div.content + div.title { + margin-top: 0.0em; +} + +div.sidebarblock > div.content { + background: #ffffee; + border: 1px solid #dddddd; + border-left: 4px solid #f0f0f0; + padding: 0.5em; +} + +div.listingblock > div.content { + border: 1px solid #dddddd; + border-left: 5px solid #f0f0f0; + background: #f8f8f8; + padding: 0.5em; +} + +div.quoteblock, div.verseblock { + padding-left: 1.0em; + margin-left: 1.0em; + margin-right: 10%; + border-left: 5px solid #f0f0f0; + color: #888; +} + +div.quoteblock > div.attribution { + padding-top: 0.5em; + text-align: right; +} + +div.verseblock > pre.content { + font-family: inherit; + font-size: inherit; +} +div.verseblock > div.attribution { + padding-top: 0.75em; + text-align: left; +} +/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ +div.verseblock + div.attribution { + text-align: left; +} + +div.admonitionblock .icon { + vertical-align: top; + font-size: 1.1em; + font-weight: bold; + text-decoration: underline; + color: #527bbd; + padding-right: 0.5em; +} +div.admonitionblock td.content { + padding-left: 0.5em; + border-left: 3px solid #dddddd; +} + +div.exampleblock > div.content { + border-left: 3px solid #dddddd; + padding-left: 0.5em; +} + +div.imageblock div.content { padding-left: 0; } +span.image img { border-style: none; vertical-align: text-bottom; } +a.image:visited { color: white; } + +dl { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +dt { + margin-top: 0.5em; + margin-bottom: 0; + font-style: normal; + color: navy; +} +dd > *:first-child { + margin-top: 0.1em; +} + +ul, ol { + list-style-position: outside; +} +ol.arabic { + list-style-type: decimal; +} +ol.loweralpha { + list-style-type: lower-alpha; +} +ol.upperalpha { + list-style-type: upper-alpha; +} +ol.lowerroman { + list-style-type: lower-roman; +} +ol.upperroman { + list-style-type: upper-roman; +} + +div.compact ul, div.compact ol, +div.compact p, div.compact p, +div.compact div, div.compact div { + margin-top: 0.1em; + margin-bottom: 0.1em; +} + +tfoot { + font-weight: bold; +} +td > div.verse { + white-space: pre; +} + +div.hdlist { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +div.hdlist tr { + padding-bottom: 15px; +} +dt.hdlist1.strong, td.hdlist1.strong { + font-weight: bold; +} +td.hdlist1 { + vertical-align: top; + font-style: normal; + padding-right: 0.8em; + color: navy; +} +td.hdlist2 { + vertical-align: top; +} +div.hdlist.compact tr { + margin: 0; + padding-bottom: 0; +} + +.comment { + background: yellow; +} + +.footnote, .footnoteref { + font-size: 0.8em; +} + +span.footnote, span.footnoteref { + vertical-align: super; +} + +#footnotes { + margin: 20px 0 20px 0; + padding: 7px 0 0 0; +} + +#footnotes div.footnote { + margin: 0 0 5px 0; +} + +#footnotes hr { + border: none; + border-top: 1px solid silver; + height: 1px; + text-align: left; + margin-left: 0; + width: 20%; + min-width: 100px; +} + +div.colist td { + padding-right: 0.5em; + padding-bottom: 0.3em; + vertical-align: top; +} +div.colist td img { + margin-top: 0.3em; +} + +@media print { + #footer-badges { display: none; } +} + +#toc { + margin-bottom: 2.5em; +} + +#toctitle { + color: #527bbd; + font-size: 1.1em; + font-weight: bold; + margin-top: 1.0em; + margin-bottom: 0.1em; +} + +div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { + margin-top: 0; + margin-bottom: 0; +} +div.toclevel2 { + margin-left: 2em; + font-size: 0.9em; +} +div.toclevel3 { + margin-left: 4em; + font-size: 0.9em; +} +div.toclevel4 { + margin-left: 6em; + font-size: 0.9em; +} + +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +span.underline { text-decoration: underline; } +span.overline { text-decoration: overline; } +span.line-through { text-decoration: line-through; } + +div.unbreakable { page-break-inside: avoid; } + + +/* + * xhtml11 specific + * + * */ + +div.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.tableblock > table { + border: 3px solid #527bbd; +} +thead, p.table.header { + font-weight: bold; + color: #527bbd; +} +p.table { + margin-top: 0; +} +/* Because the table frame attribute is overridden by CSS in most browsers. */ +div.tableblock > table[frame="void"] { + border-style: none; +} +div.tableblock > table[frame="hsides"] { + border-left-style: none; + border-right-style: none; +} +div.tableblock > table[frame="vsides"] { + border-top-style: none; + border-bottom-style: none; +} + + +/* + * html5 specific + * + * */ + +table.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +thead, p.tableblock.header { + font-weight: bold; + color: #527bbd; +} +p.tableblock { + margin-top: 0; +} +table.tableblock { + border-width: 3px; + border-spacing: 0px; + border-style: solid; + border-color: #527bbd; + border-collapse: collapse; +} +th.tableblock, td.tableblock { + border-width: 1px; + padding: 4px; + border-style: solid; + border-color: #527bbd; +} + +table.tableblock.frame-topbot { + border-left-style: hidden; + border-right-style: hidden; +} +table.tableblock.frame-sides { + border-top-style: hidden; + border-bottom-style: hidden; +} +table.tableblock.frame-none { + border-style: hidden; +} + +th.tableblock.halign-left, td.tableblock.halign-left { + text-align: left; +} +th.tableblock.halign-center, td.tableblock.halign-center { + text-align: center; +} +th.tableblock.halign-right, td.tableblock.halign-right { + text-align: right; +} + +th.tableblock.valign-top, td.tableblock.valign-top { + vertical-align: top; +} +th.tableblock.valign-middle, td.tableblock.valign-middle { + vertical-align: middle; +} +th.tableblock.valign-bottom, td.tableblock.valign-bottom { + vertical-align: bottom; +} + + +/* + * manpage specific + * + * */ + +body.manpage h1 { + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 2px solid silver; + border-bottom: 2px solid silver; +} +body.manpage h2 { + border-style: none; +} +body.manpage div.sectionbody { + margin-left: 3em; +} + +@media print { + body.manpage div#toc { display: none; } +} + + +</style> +<script type="text/javascript"> +/*<+'])'); + // Function that scans the DOM tree for header elements (the DOM2 + // nodeIterator API would be a better technique but not supported by all + // browsers). + var iterate = function (el) { + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { + var mo = re.exec(i.tagName); + if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") { + result[result.length] = new TocEntry(i, getText(i), mo[1]-1); + } + iterate(i); + } + } + } + iterate(el); + return result; + } + + var toc = document.getElementById("toc"); + if (!toc) { + return; + } + + // Delete existing TOC entries in case we're reloading the TOC. + var tocEntriesToRemove = []; + var i; + for (i = 0; i < toc.childNodes.length; i++) { + var entry = toc.childNodes[i]; + if (entry.nodeName.toLowerCase() == 'div' + && entry.getAttribute("class") + && entry.getAttribute("class").match(/^toclevel/)) + tocEntriesToRemove.push(entry); + } + for (i = 0; i < tocEntriesToRemove.length; i++) { + toc.removeChild(tocEntriesToRemove[i]); + } + + // Rebuild TOC entries. + var entries = tocEntries(document.getElementById("content"), toclevels); + for (var i = 0; i < entries.length; ++i) { + var entry = entries[i]; + if (entry.element.id == "") + entry.element.id = "_toc_" + i; + var a = document.createElement("a"); + a.href = "#" + entry.element.id; + a.appendChild(document.createTextNode(entry.text)); + var div = document.createElement("div"); + div.appendChild(a); + div.className = "toclevel" + entry.toclevel; + toc.appendChild(div); + } + if (entries.length == 0) + toc.parentNode.removeChild(toc); +}, + + +///////////////////////////////////////////////////////////////////// +// Footnotes generator +///////////////////////////////////////////////////////////////////// + +/* Based on footnote generation code from: + * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html + */ + +footnotes: function () { + // Delete existing footnote entries in case we're reloading the footnodes. + var i; + var noteholder = document.getElementById("footnotes"); + if (!noteholder) { + return; + } + var entriesToRemove = []; + for (i = 0; i < noteholder.childNodes.length; i++) { + var entry = noteholder.childNodes[i]; + if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote") + entriesToRemove.push(entry); + } + for (i = 0; i < entriesToRemove.length; i++) { + noteholder.removeChild(entriesToRemove[i]); + } + + // Rebuild footnote entries. + var cont = document.getElementById("content"); + var spans = cont.getElementsByTagName("span"); + var refs = {}; + var n = 0; + for (i=0; i<spans.length; i++) { + if (spans[i].className == "footnote") { + n++; + var note = spans[i].getAttribute("data-note"); + if (!note) { + // Use [\s\S] in place of . so multi-line matches work. + // Because JavaScript has no s (dotall) regex flag. + note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1]; + spans[i].innerHTML = + "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + + "' title='View footnote' class='footnote'>" + n + "</a>]"; + spans[i].setAttribute("data-note", note); + } + noteholder.innerHTML += + "<div class='footnote' id='_footnote_" + n + "'>" + + "<a href='#_footnoteref_" + n + "' title='Return to text'>" + + n + "</a>. " + note + "</div>"; + var id =spans[i].getAttribute("id"); + if (id != null) refs["#"+id] = n; + } + } + if (n == 0) + noteholder.parentNode.removeChild(noteholder); + else { + // Process footnoterefs. + for (i=0; i<spans.length; i++) { + if (spans[i].className == "footnoteref") { + var href = spans[i].getElementsByTagName("a")[0].getAttribute("href"); + href = href.match(/#.*/)[0]; // Because IE return full URL. + n = refs[href]; + spans[i].innerHTML = + "[<a href='#_footnote_" + n + + "' title='View footnote' class='footnote'>" + n + "</a>]"; + } + } + } +}, + +install: function(toclevels) { + var timerId; + + function reinstall() { + asciidoc.footnotes(); + if (toclevels) { + asciidoc.toc(toclevels); + } + } + + function reinstallAndRemoveTimer() { + clearInterval(timerId); + reinstall(); + } + + timerId = setInterval(reinstall, 500); + if (document.addEventListener) + document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false); + else + window.onload = reinstallAndRemoveTimer; +} + +} +asciidoc.install(); +/*]]>*/ +</script> +</head> +<body class="article"> +<div id="header"> +<h1>Parallel Checkout Design Notes</h1> +</div> +<div id="content"> +<div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"><p>The "Parallel Checkout" feature attempts to use multiple processes to +parallelize the work of uncompressing the blobs, applying in-core +filters, and writing the resulting contents to the working tree during a +checkout operation. It can be used by all checkout-related commands, +such as <code>clone</code>, <code>checkout</code>, <code>reset</code>, <code>sparse-checkout</code>, and others.</p></div> +<div class="paragraph"><p>These commands share the following basic structure:</p></div> +<div class="ulist"><ul> +<li> +<p> +Step 1: Read the current index file into memory. +</p> +</li> +<li> +<p> +Step 2: Modify the in-memory index based upon the command, and + temporarily mark all cache entries that need to be updated. +</p> +</li> +<li> +<p> +Step 3: Populate the working tree to match the new candidate index. + This includes iterating over all of the to-be-updated cache entries + and delete, create, or overwrite the associated files in the working + tree. +</p> +</li> +<li> +<p> +Step 4: Write the new index to disk. +</p> +</li> +</ul></div> +<div class="paragraph"><p>Step 3 is the focus of the "parallel checkout" effort described here.</p></div> +</div> +</div> +<div class="sect1"> +<h2 id="_sequential_implementation">Sequential Implementation</h2> +<div class="sectionbody"> +<div class="paragraph"><p>For the purposes of discussion here, the current sequential +implementation of Step 3 is divided in 3 parts, each one implemented in +its own function:</p></div> +<div class="ulist"><ul> +<li> +<p> +Step 3a: <code>unpack-trees.c:check_updates()</code> contains a series of + sequential loops iterating over the <code>cache_entry</code>'s array. The main + loop in this function calls the Step 3b function for each of the + to-be-updated entries. +</p> +</li> +<li> +<p> +Step 3b: <code>entry.c:checkout_entry()</code> examines the existing working tree + for file conflicts, collisions, and unsaved changes. It removes files + and creates leading directories as necessary. It calls the Step 3c + function for each entry to be written. +</p> +</li> +<li> +<p> +Step 3c: <code>entry.c:write_entry()</code> loads the blob into memory, smudges + it if necessary, creates the file in the working tree, writes the + smudged contents, calls <code>fstat()</code> or <code>lstat()</code>, and updates the + associated <code>cache_entry</code> struct with the stat information gathered. +</p> +</li> +</ul></div> +<div class="paragraph"><p>It wouldn’t be safe to perform Step 3b in parallel, as there could be +race conditions between file creations and removals. Instead, the +parallel checkout framework lets the sequential code handle Step 3b, +and uses parallel workers to replace the sequential +<code>entry.c:write_entry()</code> calls from Step 3c.</p></div> +</div> +</div> +<div class="sect1"> +<h2 id="_rejected_multi_threaded_solution">Rejected Multi-Threaded Solution</h2> +<div class="sectionbody"> +<div class="paragraph"><p>The most "straightforward" implementation would be to spread the set of +to-be-updated cache entries across multiple threads. But due to the +thread-unsafe functions in the ODB code, we would have to use locks to +coordinate the parallel operation. An early prototype of this solution +showed that the multi-threaded checkout would bring performance +improvements over the sequential code, but there was still too much lock +contention. A <code>perf</code> profiling indicated that around 20% of the runtime +during a local Linux clone (on an SSD) was spent in locking functions. +For this reason this approach was rejected in favor of using multiple +child processes, which led to a better performance.</p></div> +</div> +</div> +<div class="sect1"> +<h2 id="_multi_process_solution">Multi-Process Solution</h2> +<div class="sectionbody"> +<div class="paragraph"><p>Parallel checkout alters the aforementioned Step 3 to use multiple +<code>checkout--worker</code> background processes to distribute the work. The +long-running worker processes are controlled by the foreground Git +command using the existing run-command API.</p></div> +<div class="sect2"> +<h3 id="_overview">Overview</h3> +<div class="paragraph"><p>Step 3b is only slightly altered; for each entry to be checked out, the +main process performs the following steps:</p></div> +<div class="ulist"><ul> +<li> +<p> +M1: Check whether there is any untracked or unclean file in the + working tree which would be overwritten by this entry, and decide + whether to proceed (removing the file(s)) or not. +</p> +</li> +<li> +<p> +M2: Create the leading directories. +</p> +</li> +<li> +<p> +M3: Load the conversion attributes for the entry’s path. +</p> +</li> +<li> +<p> +M4: Check, based on the entry’s type and conversion attributes, + whether the entry is eligible for parallel checkout (more on this + later). If it is eligible, enqueue the entry and the loaded + attributes to later write the entry in parallel. If not, write the + entry right away, using the default sequential code. +</p> +</li> +</ul></div> +<div class="paragraph"><p>Note: we save the conversion attributes associated with each entry +because the workers don’t have access to the main process' index state, +so they can’t load the attributes by themselves (and the attributes are +needed to properly smudge the entry). Additionally, this has a positive +impact on performance as (1) we don’t need to load the attributes twice +and (2) the attributes machinery is optimized to handle paths in +sequential order.</p></div> +<div class="paragraph"><p>After all entries have passed through the above steps, the main process +checks if the number of enqueued entries is sufficient to spread among +the workers. If not, it just writes them sequentially. Otherwise, it +spawns the workers and distributes the queued entries uniformly in +continuous chunks. This aims to minimize the chances of two workers +writing to the same directory simultaneously, which could increase lock +contention in the kernel.</p></div> +<div class="paragraph"><p>Then, for each assigned item, each worker:</p></div> +<div class="ulist"><ul> +<li> +<p> +W1: Checks if there is any non-directory file in the leading part of + the entry’s path or if there already exists a file at the entry' path. + If so, mark the entry with <code>PC_ITEM_COLLIDED</code> and skip it (more on + this later). +</p> +</li> +<li> +<p> +W2: Creates the file (with O_CREAT and O_EXCL). +</p> +</li> +<li> +<p> +W3: Loads the blob into memory (inflating and delta reconstructing + it). +</p> +</li> +<li> +<p> +W4: Applies any required in-process filter, like end-of-line + conversion and re-encoding. +</p> +</li> +<li> +<p> +W5: Writes the result to the file descriptor opened at W2. +</p> +</li> +<li> +<p> +W6: Calls <code>fstat()</code> or lstat()` on the just-written path, and sends + the result back to the main process, together with the end status of + the operation and the item’s identification number. +</p> +</li> +</ul></div> +<div class="paragraph"><p>Note that, when possible, steps W3 to W5 are delegated to the streaming +machinery, removing the need to keep the entire blob in memory.</p></div> +<div class="paragraph"><p>If the worker fails to read the blob or to write it to the working tree, +it removes the created file to avoid leaving empty files behind. This is +the <strong>only</strong> time a worker is allowed to remove a file.</p></div> +<div class="paragraph"><p>As mentioned earlier, it is the responsibility of the main process to +remove any file that blocks the checkout operation (or abort if the +removal(s) would cause data loss and the user didn’t ask to <code>--force</code>). +This is crucial to avoid race conditions and also to properly detect +path collisions at Step W1.</p></div> +<div class="paragraph"><p>After the workers finish writing the items and sending back the required +information, the main process handles the results in two steps:</p></div> +<div class="ulist"><ul> +<li> +<p> +First, it updates the in-memory index with the <code>lstat()</code> information + sent by the workers. (This must be done first as this information + might me required in the following step.) +</p> +</li> +<li> +<p> +Then it writes the items which collided on disk (i.e. items marked + with <code>PC_ITEM_COLLIDED</code>). More on this below. +</p> +</li> +</ul></div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_path_collisions">Path Collisions</h2> +<div class="sectionbody"> +<div class="paragraph"><p>Path collisions happen when two different paths correspond to the same +entry in the file system. E.g. the paths <em>a</em> and <em>A</em> would collide in a +case-insensitive file system.</p></div> +<div class="paragraph"><p>The sequential checkout deals with collisions in the same way that it +deals with files that were already present in the working tree before +checkout. Basically, it checks if the path that it wants to write +already exists on disk, makes sure the existing file doesn’t have +unsaved data, and then overwrites it. (To be more pedantic: it deletes +the existing file and creates the new one.) So, if there are multiple +colliding files to be checked out, the sequential code will write each +one of them but only the last will actually survive on disk.</p></div> +<div class="paragraph"><p>Parallel checkout aims to reproduce the same behavior. However, we +cannot let the workers racily write to the same file on disk. Instead, +the workers detect when the entry that they want to check out would +collide with an existing file, and mark it with <code>PC_ITEM_COLLIDED</code>. +Later, the main process can sequentially feed these entries back to +<code>checkout_entry()</code> without the risk of race conditions. On clone, this +also has the effect of marking the colliding entries to later emit a +warning for the user, like the classic sequential checkout does.</p></div> +<div class="paragraph"><p>The workers are able to detect both collisions among the entries being +concurrently written and collisions between a parallel-eligible entry +and an ineligible entry. The general idea for collision detection is +quite straightforward: for each parallel-eligible entry, the main +process must remove all files that prevent this entry from being written +(before enqueueing it). This includes any non-directory file in the +leading path of the entry. Later, when a worker gets assigned the entry, +it looks again for the non-directories files and for an already existing +file at the entry’s path. If any of these checks finds something, the +worker knows that there was a path collision.</p></div> +<div class="paragraph"><p>Because parallel checkout can distinguish path collisions from the case +where the file was already present in the working tree before checkout, +we could alternatively choose to skip the checkout of colliding entries. +However, each entry that doesn’t get written would have NULL <code>lstat()</code> +fields on the index. This could cause performance penalties for +subsequent commands that need to refresh the index, as they would have +to go to the file system to see if the entry is dirty. Thus, if we have +N entries in a colliding group and we decide to write and <code>lstat()</code> only +one of them, every subsequent <code>git-status</code> will have to read, convert, +and hash the written file N - 1 times. By checking out all colliding +entries (like the sequential code does), we only pay the overhead once, +during checkout.</p></div> +</div> +</div> +<div class="sect1"> +<h2 id="_eligible_entries_for_parallel_checkout">Eligible Entries for Parallel Checkout</h2> +<div class="sectionbody"> +<div class="paragraph"><p>As previously mentioned, not all entries passed to <code>checkout_entry()</code> +will be considered eligible for parallel checkout. More specifically, we +exclude:</p></div> +<div class="ulist"><ul> +<li> +<p> +Symbolic links; to avoid race conditions that, in combination with + path collisions, could cause workers to write files at the wrong + place. For example, if we were to concurrently check out a symlink + <em>a</em> → <em>b</em> and a regular file <em>A/f</em> in a case-insensitive file system, + we could potentially end up writing the file <em>A/f</em> at <em>a/f</em>, due to a + race condition. +</p> +</li> +<li> +<p> +Regular files that require external filters (either "one shot" filters + or long-running process filters). These filters are black-boxes to Git + and may have their own internal locking or non-concurrent assumptions. + So it might not be safe to run multiple instances in parallel. +</p> +<div class="paragraph"><p>Besides, long-running filters may use the delayed checkout feature to +postpone the return of some filtered blobs. The delayed checkout queue +and the parallel checkout queue are not compatible and should remain +separate.</p></div> +<div class="paragraph"><p>Note: regular files that only require internal filters, like end-of-line +conversion and re-encoding, are eligible for parallel checkout.</p></div> +</li> +</ul></div> +<div class="paragraph"><p>Ineligible entries are checked out by the classic sequential codepath +<strong>before</strong> spawning workers.</p></div> +<div class="paragraph"><p>Note: submodules’s files are also eligible for parallel checkout (as +long as they don’t fall into any of the excluding categories mentioned +above). But since each submodule is checked out in its own child +process, we don’t mix the superproject’s and the submodules' files in +the same parallel checkout process or queue.</p></div> +</div> +</div> +<div class="sect1"> +<h2 id="_the_api">The API</h2> +<div class="sectionbody"> +<div class="paragraph"><p>The parallel checkout API was designed with the goal of minimizing +changes to the current users of the checkout machinery. This means that +they don’t have to call a different function for sequential or parallel +checkout. As already mentioned, <code>checkout_entry()</code> will automatically +insert the given entry in the parallel checkout queue when this feature +is enabled and the entry is eligible; otherwise, it will just write the +entry right away, using the sequential code. In general, callers of the +parallel checkout API should look similar to this:</p></div> +<div class="listingblock"> +<div class="content"> +<pre><code>int pc_workers, pc_threshold, err = 0; +struct checkout state; + +get_parallel_checkout_configs(&pc_workers, &pc_threshold); + +/* + * This check is not strictly required, but it + * should save some time in sequential mode. + */ +if (pc_workers > 1) + init_parallel_checkout(); + +for (each cache_entry ce to-be-updated) + err |= checkout_entry(ce, &state, NULL, NULL); + +err |= run_parallel_checkout(&state, pc_workers, pc_threshold, NULL, NULL);</code></pre> +</div></div> +</div> +</div> +</div> +<div id="footnotes"><hr /></div> +<div id="footer"> +<div id="footer-text"> +Last updated + 2021-04-30 15:03:30 JST +</div> +</div> +</body> +</html>
diff --git a/technical/parallel-checkout.txt b/technical/parallel-checkout.txt new file mode 100644 index 0000000..e790258 --- /dev/null +++ b/technical/parallel-checkout.txt
@@ -0,0 +1,270 @@ +Parallel Checkout Design Notes +============================== + +The "Parallel Checkout" feature attempts to use multiple processes to +parallelize the work of uncompressing the blobs, applying in-core +filters, and writing the resulting contents to the working tree during a +checkout operation. It can be used by all checkout-related commands, +such as `clone`, `checkout`, `reset`, `sparse-checkout`, and others. + +These commands share the following basic structure: + +* Step 1: Read the current index file into memory. + +* Step 2: Modify the in-memory index based upon the command, and + temporarily mark all cache entries that need to be updated. + +* Step 3: Populate the working tree to match the new candidate index. + This includes iterating over all of the to-be-updated cache entries + and delete, create, or overwrite the associated files in the working + tree. + +* Step 4: Write the new index to disk. + +Step 3 is the focus of the "parallel checkout" effort described here. + +Sequential Implementation +------------------------- + +For the purposes of discussion here, the current sequential +implementation of Step 3 is divided in 3 parts, each one implemented in +its own function: + +* Step 3a: `unpack-trees.c:check_updates()` contains a series of + sequential loops iterating over the `cache_entry`'s array. The main + loop in this function calls the Step 3b function for each of the + to-be-updated entries. + +* Step 3b: `entry.c:checkout_entry()` examines the existing working tree + for file conflicts, collisions, and unsaved changes. It removes files + and creates leading directories as necessary. It calls the Step 3c + function for each entry to be written. + +* Step 3c: `entry.c:write_entry()` loads the blob into memory, smudges + it if necessary, creates the file in the working tree, writes the + smudged contents, calls `fstat()` or `lstat()`, and updates the + associated `cache_entry` struct with the stat information gathered. + +It wouldn't be safe to perform Step 3b in parallel, as there could be +race conditions between file creations and removals. Instead, the +parallel checkout framework lets the sequential code handle Step 3b, +and uses parallel workers to replace the sequential +`entry.c:write_entry()` calls from Step 3c. + +Rejected Multi-Threaded Solution +-------------------------------- + +The most "straightforward" implementation would be to spread the set of +to-be-updated cache entries across multiple threads. But due to the +thread-unsafe functions in the ODB code, we would have to use locks to +coordinate the parallel operation. An early prototype of this solution +showed that the multi-threaded checkout would bring performance +improvements over the sequential code, but there was still too much lock +contention. A `perf` profiling indicated that around 20% of the runtime +during a local Linux clone (on an SSD) was spent in locking functions. +For this reason this approach was rejected in favor of using multiple +child processes, which led to a better performance. + +Multi-Process Solution +---------------------- + +Parallel checkout alters the aforementioned Step 3 to use multiple +`checkout--worker` background processes to distribute the work. The +long-running worker processes are controlled by the foreground Git +command using the existing run-command API. + +Overview +~~~~~~~~ + +Step 3b is only slightly altered; for each entry to be checked out, the +main process performs the following steps: + +* M1: Check whether there is any untracked or unclean file in the + working tree which would be overwritten by this entry, and decide + whether to proceed (removing the file(s)) or not. + +* M2: Create the leading directories. + +* M3: Load the conversion attributes for the entry's path. + +* M4: Check, based on the entry's type and conversion attributes, + whether the entry is eligible for parallel checkout (more on this + later). If it is eligible, enqueue the entry and the loaded + attributes to later write the entry in parallel. If not, write the + entry right away, using the default sequential code. + +Note: we save the conversion attributes associated with each entry +because the workers don't have access to the main process' index state, +so they can't load the attributes by themselves (and the attributes are +needed to properly smudge the entry). Additionally, this has a positive +impact on performance as (1) we don't need to load the attributes twice +and (2) the attributes machinery is optimized to handle paths in +sequential order. + +After all entries have passed through the above steps, the main process +checks if the number of enqueued entries is sufficient to spread among +the workers. If not, it just writes them sequentially. Otherwise, it +spawns the workers and distributes the queued entries uniformly in +continuous chunks. This aims to minimize the chances of two workers +writing to the same directory simultaneously, which could increase lock +contention in the kernel. + +Then, for each assigned item, each worker: + +* W1: Checks if there is any non-directory file in the leading part of + the entry's path or if there already exists a file at the entry' path. + If so, mark the entry with `PC_ITEM_COLLIDED` and skip it (more on + this later). + +* W2: Creates the file (with O_CREAT and O_EXCL). + +* W3: Loads the blob into memory (inflating and delta reconstructing + it). + +* W4: Applies any required in-process filter, like end-of-line + conversion and re-encoding. + +* W5: Writes the result to the file descriptor opened at W2. + +* W6: Calls `fstat()` or lstat()` on the just-written path, and sends + the result back to the main process, together with the end status of + the operation and the item's identification number. + +Note that, when possible, steps W3 to W5 are delegated to the streaming +machinery, removing the need to keep the entire blob in memory. + +If the worker fails to read the blob or to write it to the working tree, +it removes the created file to avoid leaving empty files behind. This is +the *only* time a worker is allowed to remove a file. + +As mentioned earlier, it is the responsibility of the main process to +remove any file that blocks the checkout operation (or abort if the +removal(s) would cause data loss and the user didn't ask to `--force`). +This is crucial to avoid race conditions and also to properly detect +path collisions at Step W1. + +After the workers finish writing the items and sending back the required +information, the main process handles the results in two steps: + +- First, it updates the in-memory index with the `lstat()` information + sent by the workers. (This must be done first as this information + might me required in the following step.) + +- Then it writes the items which collided on disk (i.e. items marked + with `PC_ITEM_COLLIDED`). More on this below. + +Path Collisions +--------------- + +Path collisions happen when two different paths correspond to the same +entry in the file system. E.g. the paths 'a' and 'A' would collide in a +case-insensitive file system. + +The sequential checkout deals with collisions in the same way that it +deals with files that were already present in the working tree before +checkout. Basically, it checks if the path that it wants to write +already exists on disk, makes sure the existing file doesn't have +unsaved data, and then overwrites it. (To be more pedantic: it deletes +the existing file and creates the new one.) So, if there are multiple +colliding files to be checked out, the sequential code will write each +one of them but only the last will actually survive on disk. + +Parallel checkout aims to reproduce the same behavior. However, we +cannot let the workers racily write to the same file on disk. Instead, +the workers detect when the entry that they want to check out would +collide with an existing file, and mark it with `PC_ITEM_COLLIDED`. +Later, the main process can sequentially feed these entries back to +`checkout_entry()` without the risk of race conditions. On clone, this +also has the effect of marking the colliding entries to later emit a +warning for the user, like the classic sequential checkout does. + +The workers are able to detect both collisions among the entries being +concurrently written and collisions between a parallel-eligible entry +and an ineligible entry. The general idea for collision detection is +quite straightforward: for each parallel-eligible entry, the main +process must remove all files that prevent this entry from being written +(before enqueueing it). This includes any non-directory file in the +leading path of the entry. Later, when a worker gets assigned the entry, +it looks again for the non-directories files and for an already existing +file at the entry's path. If any of these checks finds something, the +worker knows that there was a path collision. + +Because parallel checkout can distinguish path collisions from the case +where the file was already present in the working tree before checkout, +we could alternatively choose to skip the checkout of colliding entries. +However, each entry that doesn't get written would have NULL `lstat()` +fields on the index. This could cause performance penalties for +subsequent commands that need to refresh the index, as they would have +to go to the file system to see if the entry is dirty. Thus, if we have +N entries in a colliding group and we decide to write and `lstat()` only +one of them, every subsequent `git-status` will have to read, convert, +and hash the written file N - 1 times. By checking out all colliding +entries (like the sequential code does), we only pay the overhead once, +during checkout. + +Eligible Entries for Parallel Checkout +-------------------------------------- + +As previously mentioned, not all entries passed to `checkout_entry()` +will be considered eligible for parallel checkout. More specifically, we +exclude: + +- Symbolic links; to avoid race conditions that, in combination with + path collisions, could cause workers to write files at the wrong + place. For example, if we were to concurrently check out a symlink + 'a' -> 'b' and a regular file 'A/f' in a case-insensitive file system, + we could potentially end up writing the file 'A/f' at 'a/f', due to a + race condition. + +- Regular files that require external filters (either "one shot" filters + or long-running process filters). These filters are black-boxes to Git + and may have their own internal locking or non-concurrent assumptions. + So it might not be safe to run multiple instances in parallel. ++ +Besides, long-running filters may use the delayed checkout feature to +postpone the return of some filtered blobs. The delayed checkout queue +and the parallel checkout queue are not compatible and should remain +separate. ++ +Note: regular files that only require internal filters, like end-of-line +conversion and re-encoding, are eligible for parallel checkout. + +Ineligible entries are checked out by the classic sequential codepath +*before* spawning workers. + +Note: submodules's files are also eligible for parallel checkout (as +long as they don't fall into any of the excluding categories mentioned +above). But since each submodule is checked out in its own child +process, we don't mix the superproject's and the submodules' files in +the same parallel checkout process or queue. + +The API +------- + +The parallel checkout API was designed with the goal of minimizing +changes to the current users of the checkout machinery. This means that +they don't have to call a different function for sequential or parallel +checkout. As already mentioned, `checkout_entry()` will automatically +insert the given entry in the parallel checkout queue when this feature +is enabled and the entry is eligible; otherwise, it will just write the +entry right away, using the sequential code. In general, callers of the +parallel checkout API should look similar to this: + +---------------------------------------------- +int pc_workers, pc_threshold, err = 0; +struct checkout state; + +get_parallel_checkout_configs(&pc_workers, &pc_threshold); + +/* + * This check is not strictly required, but it + * should save some time in sequential mode. + */ +if (pc_workers > 1) + init_parallel_checkout(); + +for (each cache_entry ce to-be-updated) + err |= checkout_entry(ce, &state, NULL, NULL); + +err |= run_parallel_checkout(&state, pc_workers, pc_threshold, NULL, NULL); +----------------------------------------------
diff --git a/technical/partial-clone.html b/technical/partial-clone.html index 2010eaa..e73d17e 100644 --- a/technical/partial-clone.html +++ b/technical/partial-clone.html
@@ -1213,7 +1213,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-09-03 13:19:53 PDT + 2020-09-04 05:19:53 JST </div> </div> </body>
diff --git a/technical/protocol-capabilities.html b/technical/protocol-capabilities.html index 19fe6aa..e6535c4 100644 --- a/technical/protocol-capabilities.html +++ b/technical/protocol-capabilities.html
@@ -1130,7 +1130,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-12-08 16:10:07 PST + 2020-12-09 09:10:07 JST </div> </div> </body>
diff --git a/technical/protocol-common.html b/technical/protocol-common.html index cec9937..8b44955 100644 --- a/technical/protocol-common.html +++ b/technical/protocol-common.html
@@ -859,7 +859,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-08-31 14:16:00 PDT + 2016-09-01 06:16:00 JST </div> </div> </body>
diff --git a/technical/protocol-v2.html b/technical/protocol-v2.html index 72b553c..70a0a21 100644 --- a/technical/protocol-v2.html +++ b/technical/protocol-v2.html
@@ -1412,7 +1412,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-02-25 17:29:29 PST + 2021-02-26 10:29:29 JST </div> </div> </body>
diff --git a/technical/racy-git.html b/technical/racy-git.html index 0e87054..3b494fb 100644 --- a/technical/racy-git.html +++ b/technical/racy-git.html
@@ -952,7 +952,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-03-10 08:03:13 PDT + 2020-03-11 00:03:13 JST </div> </div> </body>
diff --git a/technical/reftable.html b/technical/reftable.html index 544baf8..234451b 100644 --- a/technical/reftable.html +++ b/technical/reftable.html
@@ -1925,8 +1925,36 @@ reftable stack, reload <code>tables.list</code>, and delete any tables no longer mentioned in <code>tables.list</code>.</p></div> <div class="paragraph"><p>Irregular program exit may still leave about unused files. In this case, a -cleanup operation can read <code>tables.list</code>, note its modification timestamp, and -delete any unreferenced <code>*.ref</code> files that are older.</p></div> +cleanup operation should proceed as follows:</p></div> +<div class="ulist"><ul> +<li> +<p> +take a lock <code>tables.list.lock</code> to prevent concurrent modifications +</p> +</li> +<li> +<p> +refresh the reftable stack, by reading <code>tables.list</code> +</p> +</li> +<li> +<p> +for each <code>*.ref</code> file, remove it if +</p> +<div class="ulist"><ul> +<li> +<p> +it is not mentioned in <code>tables.list</code>, and +</p> +</li> +<li> +<p> +its max update_index is not beyond the max update_index of the stack +</p> +</li> +</ul></div> +</li> +</ul></div> </div> </div> <div class="sect2"> @@ -2028,7 +2056,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2021-03-02 23:05:01 PST + 2021-04-30 15:03:30 JST </div> </div> </body>
diff --git a/technical/reftable.txt b/technical/reftable.txt index 3ef169a..d7c3b64 100644 --- a/technical/reftable.txt +++ b/technical/reftable.txt
@@ -1011,8 +1011,13 @@ in `tables.list`. Irregular program exit may still leave about unused files. In this case, a -cleanup operation can read `tables.list`, note its modification timestamp, and -delete any unreferenced `*.ref` files that are older. +cleanup operation should proceed as follows: + +* take a lock `tables.list.lock` to prevent concurrent modifications +* refresh the reftable stack, by reading `tables.list` +* for each `*.ref` file, remove it if +** it is not mentioned in `tables.list`, and +** its max update_index is not beyond the max update_index of the stack Alternatives considered
diff --git a/technical/send-pack-pipeline.html b/technical/send-pack-pipeline.html index 234792c..54d16da 100644 --- a/technical/send-pack-pipeline.html +++ b/technical/send-pack-pipeline.html
@@ -827,7 +827,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2013-08-20 08:40:27 PDT + 2013-08-21 00:40:27 JST </div> </div> </body>
diff --git a/technical/shallow.html b/technical/shallow.html index 70a8cda..e381425 100644 --- a/technical/shallow.html +++ b/technical/shallow.html
@@ -813,7 +813,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2020-08-19 16:37:10 PDT + 2020-08-20 08:37:10 JST </div> </div> </body>
diff --git a/technical/signature-format.html b/technical/signature-format.html index 89583e2..ade9581 100644 --- a/technical/signature-format.html +++ b/technical/signature-format.html
@@ -997,7 +997,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2016-07-06 14:33:48 PDT + 2016-07-07 06:33:48 JST </div> </div> </body>
diff --git a/technical/sparse-index.txt b/technical/sparse-index.txt new file mode 100644 index 0000000..3b24c1a --- /dev/null +++ b/technical/sparse-index.txt
@@ -0,0 +1,208 @@ +Git Sparse-Index Design Document +================================ + +The sparse-checkout feature allows users to focus a working directory on +a subset of the files at HEAD. The cone mode patterns, enabled by +`core.sparseCheckoutCone`, allow for very fast pattern matching to +discover which files at HEAD belong in the sparse-checkout cone. + +Three important scale dimensions for a Git working directory are: + +* `HEAD`: How many files are present at `HEAD`? + +* Populated: How many files are within the sparse-checkout cone. + +* Modified: How many files has the user modified in the working directory? + +We will use big-O notation -- O(X) -- to denote how expensive certain +operations are in terms of these dimensions. + +These dimensions are ordered by their magnitude: users (typically) modify +fewer files than are populated, and we can only populate files at `HEAD`. + +Problems occur if there is an extreme imbalance in these dimensions. For +example, if `HEAD` contains millions of paths but the populated set has +only tens of thousands, then commands like `git status` and `git add` can +be dominated by operations that require O(`HEAD`) operations instead of +O(Populated). Primarily, the cost is in parsing and rewriting the index, +which is filled primarily with files at `HEAD` that are marked with the +`SKIP_WORKTREE` bit. + +The sparse-index intends to take these commands that read and modify the +index from O(`HEAD`) to O(Populated). To do this, we need to modify the +index format in a significant way: add "sparse directory" entries. + +With cone mode patterns, it is possible to detect when an entire +directory will have its contents outside of the sparse-checkout definition. +Instead of listing all of the files it contains as individual entries, a +sparse-index contains an entry with the directory name, referencing the +object ID of the tree at `HEAD` and marked with the `SKIP_WORKTREE` bit. +If we need to discover the details for paths within that directory, we +can parse trees to find that list. + +At time of writing, sparse-directory entries violate expectations about the +index format and its in-memory data structure. There are many consumers in +the codebase that expect to iterate through all of the index entries and +see only files. In fact, these loops expect to see a reference to every +staged file. One way to handle this is to parse trees to replace a +sparse-directory entry with all of the files within that tree as the index +is loaded. However, parsing trees is slower than parsing the index format, +so that is a slower operation than if we left the index alone. The plan is +to make all of these integrations "sparse aware" so this expansion through +tree parsing is unnecessary and they use fewer resources than when using a +full index. + +The implementation plan below follows four phases to slowly integrate with +the sparse-index. The intention is to incrementally update Git commands to +interact safely with the sparse-index without significant slowdowns. This +may not always be possible, but the hope is that the primary commands that +users need in their daily work are dramatically improved. + +Phase I: Format and initial speedups +------------------------------------ + +During this phase, Git learns to enable the sparse-index and safely parse +one. Protections are put in place so that every consumer of the in-memory +data structure can operate with its current assumption of every file at +`HEAD`. + +At first, every index parse will call a helper method, +`ensure_full_index()`, which scans the index for sparse-directory entries +(pointing to trees) and replaces them with the full list of paths (with +blob contents) by parsing tree objects. This will be slower in all cases. +The only noticeable change in behavior will be that the serialized index +file contains sparse-directory entries. + +To start, we use a new required index extension, `sdir`, to allow +inserting sparse-directory entries into indexes with file format +versions 2, 3, and 4. This prevents Git versions that do not understand +the sparse-index from operating on one, while allowing tools that do not +understand the sparse-index to operate on repositories as long as they do +not interact with the index. A new format, index v5, will be introduced +that includes sparse-directory entries by default. It might also +introduce other features that have been considered for improving the +index, as well. + +Next, consumers of the index will be guarded against operating on a +sparse-index by inserting calls to `ensure_full_index()` or +`expand_index_to_path()`. If a specific path is requested, then those will +be protected from within the `index_file_exists()` and `index_name_pos()` +API calls: they will call `ensure_full_index()` if necessary. The +intention here is to preserve existing behavior when interacting with a +sparse-checkout. We don't want a change to happen by accident, without +tests. Many of these locations may not need any change before removing the +guards, but we should not do so without tests to ensure the expected +behavior happens. + +It may be desirable to _change_ the behavior of some commands in the +presence of a sparse index or more generally in any sparse-checkout +scenario. In such cases, these should be carefully communicated and +tested. No such behavior changes are intended during this phase. + +During a scan of the codebase, not every iteration of the cache entries +needs an `ensure_full_index()` check. The basic reasons include: + +1. The loop is scanning for entries with non-zero stage. These entries + are not collapsed into a sparse-directory entry. + +2. The loop is scanning for submodules. These entries are not collapsed + into a sparse-directory entry. + +3. The loop is part of the index API, especially around reading or + writing the format. + +4. The loop is checking for correct order of cache entries and that is + correct if and only if the sparse-directory entries are in the correct + location. + +5. The loop ignores entries with the `SKIP_WORKTREE` bit set, or is + otherwise already aware of sparse directory entries. + +6. The sparse-index is disabled at this point when using the split-index + feature, so no effort is made to protect the split-index API. + +Even after inserting these guards, we will keep expanding sparse-indexes +for most Git commands using the `command_requires_full_index` repository +setting. This setting will be on by default and disabled one builtin at a +time until we have sufficient confidence that all of the index operations +are properly guarded. + +To complete this phase, the commands `git status` and `git add` will be +integrated with the sparse-index so that they operate with O(Populated) +performance. They will be carefully tested for operations within and +outside the sparse-checkout definition. + +Phase II: Careful integrations +------------------------------ + +This phase focuses on ensuring that all index extensions and APIs work +well with a sparse-index. This requires significant increases to our test +coverage, especially for operations that interact with the working +directory outside of the sparse-checkout definition. Some of these +behaviors may not be the desirable ones, such as some tests already +marked for failure in `t1092-sparse-checkout-compatibility.sh`. + +The index extensions that may require special integrations are: + +* FS Monitor +* Untracked cache + +While integrating with these features, we should look for patterns that +might lead to better APIs for interacting with the index. Coalescing +common usage patterns into an API call can reduce the number of places +where sparse-directories need to be handled carefully. + +Phase III: Important command speedups +------------------------------------- + +At this point, the patterns for testing and implementing sparse-directory +logic should be relatively stable. This phase focuses on updating some of +the most common builtins that use the index to operate as O(Populated). +Here is a potential list of commands that could be valuable to integrate +at this point: + +* `git commit` +* `git checkout` +* `git merge` +* `git rebase` + +Hopefully, commands such as `git merge` and `git rebase` can benefit +instead from merge algorithms that do not use the index as a data +structure, such as the merge-ORT strategy. As these topics mature, we +may enable the ORT strategy by default for repositories using the +sparse-index feature. + +Along with `git status` and `git add`, these commands cover the majority +of users' interactions with the working directory. In addition, we can +integrate with these commands: + +* `git grep` +* `git rm` + +These have been proposed as some whose behavior could change when in a +repo with a sparse-checkout definition. It would be good to include this +behavior automatically when using a sparse-index. Some clarity is needed +to make the behavior switch clear to the user. + +This phase is the first where parallel work might be possible without too +much conflicts between topics. + +Phase IV: The long tail +----------------------- + +This last phase is less a "phase" and more "the new normal" after all of +the previous work. + +To start, the `command_requires_full_index` option could be removed in +favor of expanding only when hitting an API guard. + +There are many Git commands that could use special attention to operate as +O(Populated), while some might be so rare that it is acceptable to leave +them with additional overhead when a sparse-index is present. + +Here are some commands that might be useful to update: + +* `git sparse-checkout set` +* `git am` +* `git clean` +* `git stash`
diff --git a/technical/trivial-merge.html b/technical/trivial-merge.html index 7d3c801..03ef32c 100644 --- a/technical/trivial-merge.html +++ b/technical/trivial-merge.html
@@ -856,7 +856,7 @@ <div id="footer"> <div id="footer-text"> Last updated - 2017-09-10 01:38:46 PDT + 2017-09-10 17:38:46 JST </div> </div> </body>